将字符串的长度分配给整数:C++

使用 C++,我想创建一个 for 循环如下(text是一个std::string):

 for(int i = text.size(); i >= 0; i--) {
 {

请有人帮助我理解为什么我的编译器(Xcode)要求我初始化i为无符号长整数,而不是整数?

我假设以下内容,但我不知道,我想更好地理解:我相信它与最大值为 2147483647 的整数有关,而 unsigned long 的最大值为 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 循环修改为:

  1. 声明istd::size_t
  2. 在条件检查中将减量作为后减量移动
  3. 完全删除增量步骤。

结果如下所示:

for (std::size_t i = text.size(); i-- > 0;)
{
    // use text[i] here
}

这将在循环体中从(text.size()-1)through 开始枚举0,然后中断循环。即使字符串为空,它也能工作。

请注意,这种 hijinks 是一个更大问题的迹象:首先使用错误的构造。std::string提供反向迭代器用于向后遍历字符串内容:

for (auto it = text.rbegin(); it != text.rend(); ++it)
{
    // use *it  to access each character in reverse order
}

在这两种方法中,第二种是优选的。

  • You missed the opportunity to use the "goes-to" operator: `i --> 0` 🙂

以上是将字符串的长度分配给整数:C++的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>