[英]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。 您的选择:
使用int;
继续使用size_type,但更改循环:
for(string::size_type i = s.length(); i > 0; --i) { ret += s[i-1]; }
或我最喜欢的选择:
std::reverse_iterator
并在一行中完成整个操作: 像这样:
std::string ret(s.rbegin(), s.rend());
一些其他评论:
不要返回对静态字符串的引用。 它不是线程安全的。 按值返回(即返回std::string
,而不是const std::string&
)。
为了获得更好的性能,请为字符串预分配所需的容量: 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.