2

I am wondering is this way of reversing a string is safe?

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::reverseから使用する必要があります<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は 8 ビットの長さのシーケンスですchar(少なくともほとんどのプラットフォームでは)。日本語の文字列 (ただし、フランス語、イタリア語、またはドイツ語の文字列でさえ) は、0..127 の範囲外のコードポイントを含む可能性があるため、8 ビット文字に表現するには多少エンコードする必要があります。 1 よりもchar。-scharを逆の順序で配置しても、テキストが逆になるわけではなく、完全に混乱するだけです。

1 character <=> 1 char純粋な ASCII テキストに対してのみ true であると仮定します。

于 2012-11-22T07:50:34.860 に答える