2011-12-12 50 views
37

什麼是最有效的方式前置std::string?是否值得寫出一個完整的函數來完成,或者只需要1-2行?我沒有看到與std::string::push_front相關的任何內容。前置std ::字符串

+2

任何你不能做's = a + s'的原因嗎? –

+0

你的意思是什麼? @MikeBantegui提到過嗎?或者你正在嘗試做其他事情? – Ankit

+0

預先考慮一個字符串不會很高效,也許最好追加到字符串並在完成時將其反轉。 – GWW

回答

55

實際上存在與不存在的std::string::push_front類似的功能,請參見下面的示例。


Documentation of std::string::insert

#include <iostream> 
#include <string> 

int 
main (int argc, char *argv[]) 
{ 
    std::string s1 (" world"); 
    std::string s2 ("ello"); 

    s1.insert (0,  s2); // insert the contents of s2 at offset 0 in s1 
    s1.insert (0, 1, 'h'); // insert one (1) 'h'  at offset 0 in s1 

    std::cout << s1 << std::endl; 
} 

輸出:

hello world 

由於前面加上一個字符串數據可能同時需要重新分配並複製現有數據/移動你可以得到一些性能優勢通過使用std::string::reserve擺脫重新分配部分(分配更多記憶之前)。

數據的複製/移動非常不可避免,除非您定義自己定製的類,類似std::string那樣分配大緩衝區並將第一個內容放在此內存緩衝區的中心。

然後,如果緩衝區足夠大,那麼您可以在不重新分配數據和移動數據的情況下預先添加數據並追加數據。從來源複製到目的地儘管如此,顯然仍然需要。


如果你有,你知道緩衝區你會前插往往比你追加一個很好的選擇是存儲字符串倒退,並在需要時反轉(如果是比較少見數據)。

+0

我還想補充一點,如果你需要在一個字符串中添加多個項目,你可以首先追加這些項目,然後使用中的std :: rotate將它們旋轉到前面,以避免二次時間性能。 –

3

有一個超載string operator+ (char lhs, const string& rhs);,所以你可以做your_string 'a' + your_string來模仿push_front

這不是就地,但創建一個新的字符串,所以不要指望它是有效的,但。對於(可能)更高效的解決方案,請使用resize來收集空間,std::copy_backward將整個字符串向後移一位,並在開頭插入新字符。

+0

你應該**不要**使用'std :: string :: resize'來「收集更多空間」,如果需要的話,該函數會使內部緩衝區更大,這是真的。但它也會用'char()'(也被稱爲'NULL'(即值爲0))填充當前字符串。參見[codepad paste](http://codepad.org/MxX3wH3d) –

0

如果您使用std::string::append,你應該意識到,以下是等價的:

std::string lhs1 = "hello "; 
std::string lh2 = "hello "; 
std::string rhs = "world!"; 

lhs1.append(rhs); 
lhs2 += rhs; // equivalent to above 
// Also the same: 
// lhs2 = lhs + rhs; 

同樣,「前置」將等同於以下內容:

std::string result = "world"; 
result = "hello " + result; 
// If prepend existed, this would be equivalent to 
// result.prepend("hello"); 

你應該注意到,儘管如此,這樣做效率卻不高。

+5

有人知道爲什麼這個答案是downvoted嗎?它的聲明是不正確的嗎?我們是什麼,讀者5年後,意味着從不明原因的downvotes推斷?這沒有人幫助,有人可以詳細說明,最後? –

4
myString.insert(0, otherString); 

讓標準模板庫編寫者擔心效率;利用他們所有的工作時間,而不是重新編程車輪。

這樣做的兩個。

只要你使用的STL實現被認爲是通過你會有高效的代碼。如果你使用的是寫得不好的STL,那麼你就有更大的問題:)

+4

效率低下的算法不能通過智能實現來拯救。 –

相關問題