2012-11-22 19 views
2

我想知道是否這種反轉字符串的方式是安全的?這樣倒轉字符串是否安全?

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

使用'std :: reverse()'有什麼問題嗎? – Aesthete

+0

它只是沒有發生在我身上:) – qdii

回答

3

根據§21.4.6.3/ 20,assign(first,last)(迭代器firstlast)等效於

assign(string(first,last)) 

因此,它首先創建一個新的字符串對象,然後分配給它。當你仍然複製時(如果這是你所害怕的),你從中複製的字符串(反向)將不會被修改。

然而,使用其他人建議的std::reverse(begin(str),end(str))更好,可能更有效。

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()); 
1

正如其他人所建議的那樣,事實上,您所做的是顛倒了char序列。 這實際上顛倒了事實上取決於什麼概念「反向」和「」和「焦炭」的意思是。

std::string是一個長度爲8位(至少在大多數平臺上)的char的序列。 日文字符串(但是即使是法文或意大利文或德文)也可以包含0..127範圍之外的代碼點,因此需要進行編碼以表示爲8位字符,因此「字符」可能會保留超過1 char。以相反的順序放置char不會顛倒文本,它只是完全搞砸了。

假設1 character <=> 1 char僅適用於純ASCII文本。

相關問題