繁体   English   中英

诠释工程,但string :: size_type不起作用

[英]int works but string::size_type doesn't

    #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;
    }

上面的代码使程序在运行时崩溃。 但是,如果我将i的类型更改为int那么它可以工作。

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

我认为也许string::size_type的类型与数组索引不兼容,所以我尝试将索引i强制转换为int ,但这也不起作用。

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

  1. 使用int;

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

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

或我最喜欢的选择:

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

像这样:

std::string ret(s.rbegin(), s.rend());

一些其他评论:

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

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

您应该按值传递并返回std::string

std::string strReverse( std::string s)
{
     for( size_t i = 0; i < s.size() / 2; ++i )
         std::swap( s[i], s[s.size()-i-1] );
     return s;
}

同时使您的功能更简单,更正确。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM