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

标签 c++ size stdstring unsigned-long-long-int

使用 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 循环修改为:

  • 声明 istd::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
    }
    
    在这两种方法中,第二种是优选的。

    关于c++ - 将字符串的长度分配给整数 : C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66492445/

    相关文章:

    c++ - std::vector.size() 不工作

    c++ - 尝试编写可以从 std::string move 语义的字符串类

    c++ - Std::pair/ostringstream 构造函数语法

    c++ - 从图像中获取不正确的读数

    java - 在 C++ 之后学习 Java 的最佳方法?

    python - 为什么 False 值 (0) 的字节数小于 True (1)?

    c++ - 用 C++ 字符串替换 snprintf

    c++ - 在 Visual Studio 2013 上使用 QT

    c++ - boost.Geometry 运算符

    Java 数组大小