什麼是最有效的方式前置std::string
?是否值得寫出一個完整的函數來完成,或者只需要1-2行?我沒有看到與std::string::push_front
相關的任何內容。前置std ::字符串
回答
實際上存在與不存在的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
那樣分配大緩衝區並將第一個內容放在此內存緩衝區的中心。
然後,如果緩衝區足夠大,那麼您可以在不重新分配數據和移動數據的情況下預先添加數據並追加數據。從來源複製到目的地儘管如此,顯然仍然需要。
如果你有,你知道緩衝區你會前插往往比你追加一個很好的選擇是存儲字符串倒退,並在需要時反轉(如果是比較少見數據)。
我還想補充一點,如果你需要在一個字符串中添加多個項目,你可以首先追加這些項目,然後使用
有一個超載string operator+ (char lhs, const string& rhs);
,所以你可以做your_string 'a' + your_string
來模仿push_front
。
這不是就地,但創建一個新的字符串,所以不要指望它是有效的,但。對於(可能)更高效的解決方案,請使用resize
來收集空間,std::copy_backward
將整個字符串向後移一位,並在開頭插入新字符。
你應該**不要**使用'std :: string :: resize'來「收集更多空間」,如果需要的話,該函數會使內部緩衝區更大,這是真的。但它也會用'char()'(也被稱爲'NULL'(即值爲0))填充當前字符串。參見[codepad paste](http://codepad.org/MxX3wH3d) –
如果您使用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");
你應該注意到,儘管如此,這樣做效率卻不高。
有人知道爲什麼這個答案是downvoted嗎?它的聲明是不正確的嗎?我們是什麼,讀者5年後,意味着從不明原因的downvotes推斷?這沒有人幫助,有人可以詳細說明,最後? –
myString.insert(0, otherString);
讓標準模板庫編寫者擔心效率;利用他們所有的工作時間,而不是重新編程車輪。
這樣做的兩個。
只要你使用的STL實現被認爲是通過你會有高效的代碼。如果你使用的是寫得不好的STL,那麼你就有更大的問題:)
效率低下的算法不能通過智能實現來拯救。 –
- 1. std ::字符串vs字符串
- 2. std :: vector中的push_back()<std::string>覆蓋當前字符串
- 3. 字符串排序 - std :: set或std :: vector?
- 4. std :: cin雙字符串
- 5. 更換的std ::字符串
- 6. std ::字符串優化?
- 7. jQuery - 查找字符串並將字符串前置到它?
- 8. C#字符串VS STD:字符串:問題在傳球串
- 9. 字符在字符串中當前位置左側的位置
- 10. std :: stringstream - 字符串到數字工作
- 11. 前置在字符串蟒每一行
- 12. 將字符串前置到Smarty變量
- 13. 將某個字符串寫入std之前的gdb中斷:cerr
- 14. 奇怪的錯誤 - std :: regex只匹配前兩個字符串
- 15. 的std :: stringstream的閱讀int和字符串,字符串中的
- 16. std :: string,字符串val和字符串之間的區別val =「」
- 17. .NET系統::字符串到std ::字符串
- 18. 轉換系統:字符串^(C#字符串)到C++的std :: string
- 19. 如果字符串以子字符串開頭,使用std :: equal
- 20. 轉換系統::字符串^%到std ::字符串&
- 21. 如何SWIG std ::字符串&到C#ref字符串
- 22. 如何將char字符串轉換爲std字符串
- 23. 系統字符串std沒有元帥字符串
- 24. 置字符串
- 25. 計算字符串前置字符的排列
- 26. 如何使用std :: map將字符串和字符對映射到字符串?
- 27. 使用std :: regex_token_iterator(不necessarilly)找到字符串中的字符位置
- 28. 如何設置從STD字符串的char *值(c_str())不工作
- 29. 使用TaskDialogConfig與std ::字符串
- 30. 如何epur std ::字符串在c + +?
任何你不能做's = a + s'的原因嗎? –
你的意思是什麼? @MikeBantegui提到過嗎?或者你正在嘗試做其他事情? – Ankit
預先考慮一個字符串不會很高效,也許最好追加到字符串並在完成時將其反轉。 – GWW