c++ - 将字符串的长度分配给整数:C++
问题描述
使用 C++,我想创建一个如下的 for 循环(text
is a std::string
):
for(int i = text.size(); i >= 0; i--) {
{
请有人帮我理解为什么我的编译器(Xcode)要求我初始化i
为无符号长整数,而不是整数?
我假设以下,但我不知道,我想更好地理解:我相信它与最大值为 2147483647 的整数有关,而无符号长整数的最大值为 18,446,744,073,709,551,615。既然一个字符串最多可以容纳 4294967295 个字符,那么使用整数是不合适的,因为它的最大值不能代表字符串的最大长度?
最后,unsigned long 数据类型是否合适,还是应该使用 long int?
我修改后的for循环如下:
for(unsigned long i = text.size(); i >= 0; i--) {
}
或者
for(long int i = text.size(); i >= 0; i--) {
}
解决方案
std::string::size()
返回无符号整数类型 ( std::size_t
)。更改的类型i
很容易,但引入了另一个问题。i
键入时,std::size_t
循环条件被打破;根据定义,无符号类型总是>= 0
还有其他选择,最直接的是将整个 for 循环修改为:
- 声明
i
为std::size_t
- 在条件检查中将减量作为后减量移动
- 完全删除增量步骤。
结果如下所示:
for (std::size_t i = text.size(); i-- > 0;)
{
// use text[i] here
}
这将在循环体中从包含范围内枚举(text.size()-1)
,0
然后中断循环。即使字符串为空,它也会起作用。
请注意,这样的 hijinks 是一个更大问题的标志:首先使用了错误的构造。std::string
提供反向迭代器来向后遍历字符串内容:
for (auto it = text.rbegin(); it != text.rend(); ++it)
{
// use *it to access each character in reverse order
}
这两种方法中,首选第二种。
推荐阅读
- python - Selenium 适用于 python2 但不适用于 python3
- javascript - SCSS 中的 url() 无法使用 Webpack 4 正确解析
- python - 将单位矩阵连接到每个向量
- xml - 具有嵌套数据的 Postgresql XML 到表
- android - 如何从数组中随机获取字符串而不重复字符串?
- javascript - 转换 Json 数据
- opengl - GLSL 会删除未使用的变量吗?
- ansible - 如何在 ansible-playbook 中设置 2 个环境(PATH 和 proxy_env)?
- php - PHP 使用 cookie 发送 POST 请求
- sql-server - 在 Entity Framework Core 中调用 EnsureDbCreated 会引发异常“用户 Dev1 登录失败”