int工作但但是string :: size_type没有

Bek*_*eko 0 c++ string int

    #include <string>
    #include <iostream>

    using namespace std;

    const string& strReverse(const string&);

    int main() {
        cout << strReverse("POT") << endl;
    }

    const string& strReverse(const string& s) {
        static string ret;
        ret = "";


        for(string::size_type i = s.length()-1; i >= 0; --i) {
            ret += s[i];
        }

        return ret;
    }
Run Code Online (Sandbox Code Playgroud)

上面的代码会导致程序在运行时崩溃.但是,如果我改变的类型i,以int它的工作原理.

这是为什么?我认为使用string::size_type比使用特定类型更"安全" int.使用auto也会导致程序崩溃.

我认为类型可能string::size_type与数组索引不兼容,所以我尝试将索引转换iint,但这也不起作用.

Dod*_*ion 10

这是因为string::size_type是无符号的,因此for循环的终止条件i >= 0将始终为真.你的选择:

  1. 使用int;

  2. 继续使用size_type但更改循环:

    for(string::size_type i = s.length(); i > 0; --i) {
        ret += s[i-1];
    }
    
    Run Code Online (Sandbox Code Playgroud)

或者我最喜欢的选择:

  1. 使用std::reverse_iterator并在一行中完成整个事情:

像这样:

std::string ret(s.rbegin(), s.rend());
Run Code Online (Sandbox Code Playgroud)

一些额外的评论:

  1. 不要返回对静态字符串的引用.它不是线程安全的.按值返回(即返回a std::string,而不是a const std::string&).

  2. 为了获得更好的性能,请为字符串预分配所需的容量:ret.reserve(s.size());.

  • @Slava好抓.我在这里的回答只关注循环.你是对的.该函数应该返回一个简单的`std :: string`,而不是`const std :: string&`.(实际上,它不是悬挂参考,因为它是对静态的引用,但也非常非常糟糕.) (3认同)
  • @Steve这里不适用,因为循环需要反向运行. (2认同)