这种方法可以安全地反转字符串吗?

时间:2012-11-22 06:32:51

标签: c++ string

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

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

3 个答案:

答案 0 :(得分:3)

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

assign(string(first,last))

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

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

答案 1 :(得分:1)

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

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

这会将字符串反转到位。如果您想创建一个新字符串,那么您基本上使用assign()执行代码,但使用std::string构造函数:

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

答案 2 :(得分:1)

正如其他人所建议的那样,你所做的事情实际上颠倒了char序列。 这实际上反转字符串的事实取决于“ reverse ”和“ string ”和“ char “意味着。”

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

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