这种反转字符串的方式安全吗?



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

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

根据 §21.4.6.3/20,assign(first,last)(带有迭代器 firstlast )等效

assign(string(first,last))
因此,它

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

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

我不知道

这是要求审查您的代码,还是您不知道其他选项,但您应该只使用std::reverse <algorithm>

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

这会将字符串反转到位。如果你想创建一个新字符串,你实际上是在做你在代码中做的事情,使用 assign() 但使用 std::string 构造函数:

std::string reversed(str.rbegin(), str.rend());

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

std::string是 8 位长的char序列(至少在大多数平台上)。日语字符串(但即使是法语、意大利语或德语字符串)可以包含 0..127 范围之外的代码点,因此需要进行一些编码才能表示为 8 位字符,因此"字符"可以保留超过 1 char。将char -s 按相反顺序排列不会反转文本,它只是完全搞砸了。

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