2

我想知道这种反转字符串的方式是否安全?

void ReverseString( std::string & stringToReverse )
{
    stringToReverse.assign( stringToReverse.rbegin(), stringToReverse.rend() );
}
4

3 回答 3

3

根据 §21.4.6.3/20,assign(first,last)(使用迭代器firstlast)相当于

assign(string(first,last))

因此它首先创建一个新的字符串对象,然后分配它。当您仍在复制时(如果这是您所害怕的),您复制的字符串(反向)被修改是没有风险的。

但是,std::reverse(begin(str),end(str))按照其他人的建议使用会更好,并且可能更有效。

于 2012-11-22T06:44:56.543 回答
1

我不知道这是否是要求审查您的代码,或者您不知道其他选项,但您应该使用std::reversefrom<algorithm>

std::string str = "Hello world!";
std::reverse(str.begin(), str.end());

这将字符串反转到位。如果您想创建一个新字符串,您实际上是在使用构造函数执行代码中assign()的操作std::string

std::string reversed(str.rbegin(), str.rend());
于 2012-11-22T06:36:37.880 回答
1

正如其他人所建议的那样,实际上,您所做的事情颠倒了char顺序。这实际上反转字符串的事实取决于“ reverse ”和“ string ”和“ char ”的概念是什么意思。

Anstd::string是一个char8 位长的序列(至少在大多数平台上)。一个日语字符串(甚至是法语、意大利语或德语字符串)可以包含超出 0..127 范围的代码点,因此需要进行一些编码才能表示为 8 位字符,因此“字符”可能会保留更多比 1 char。以相反的顺序放置char-s 不会颠倒文本,它只会把它完全弄乱。

假设1 character <=> 1 char仅适用于纯 ASCII 文本。

于 2012-11-22T07:50:34.860 回答