當**reviower人說:「不要使用字串連線操作符,它不是那麼高效」時,使用者常常感到驚訝。std::string::operator+
不高效?搞錯了吧?
事實證明,這樣的低效率並不是顯而易見的。實際上,這兩個**段的執行時間幾乎相同:
std::string foo = longstring1();
std::string bar = longstring2();
std::string foobar = foo + bar;
std::string foo = longstring1();
std::string bar = longstring2();
std::string foobar = absl::strcat(foo, bar);
但是,這兩個片段的情況並非如此:
std::string foo = longstring1();
std::string bar = longstring2();
std::string baz = longstring3();
string foobar = foo + bar + baz;
std::string foo = longstring1();
std::string bar = longstring2();
std::string baz = longstring3();
std::string foobar = absl::strcat(foo, bar, baz);
當我們把foo+bar+baz表示式中發生的事情分開時,可以理解這兩種情況不同的原因。因為c++中沒有三個引數操作符的過載,所以這個操作必然會對string::在這兩個呼叫之間,操作將構造(和儲存)乙個臨時字串。所以std::字串foobar = foo + bar + baz
確實等價於:
std::string temp = foo + bar;
std::string foobar = std::move(temp) + baz;
具體來說,請注意,在將foo和bar的內容放入foobar之前,必須將它們複製到臨時位置。c++ 11至少允許第二個級聯發生,而不需要建立乙個新的std::move(temp) + baz。
但是,最初為臨時檔案分配的緩衝區可能不夠大,無法容納最後乙個字串,在這種情況下,需要重新分配(和另乙個副本)。因此,在最壞的情況下,n個字串連線鏈需要o(n)重新分配
最好使用absl::strcat()
,absl/strings/str_cat.h是乙個很好的助手函式,它計算必要的字串長度,保留該大小,並將所有輸入資料連線到輸出中—乙個優化良好的o(n)
。同樣,對於以下情況:
foobar += foo + bar + baz;
std::string foo = absl::strcat("the year is ", year);
字串連線
輸入n個字串s i 你要把他們按某個順序連線起來,使得字典序最小。1 n 100 每個字串長度 100 字串只包含小寫字母 input 第一行乙個整數n。接下來每行乙個字串s i output 一行乙個字串表示把輸入的n個字串按某個順序連線之後的結果input示例 6 itlooks like an...
字串連線
mysql select abc 123 abc 123 123 1 row in set,1 warning 0.00 sec mysql select 123 123 123 123 246 1 row in set 0.00 sec mysql select 123 123 123 123 2...
字串連線
answer1 char型別 利用cin不包括空格的天然特性,讀取兩個字串,直接按序輸出 include include using namespace std int main return0 answer2 string型別 對於string型別變數,我們可以直接用 進行連線操作 include...