在 C++ 中,std::string
是一個類似於 std::vector
的動態容器,這意味著它的操作具有相似的效能特性。我們先定義以下變數:
s
是一個std::string
c
是一個char
當使用 push_back
或 +
運算子將字元附加到字串時,根據操作方式的不同,其效率也會有所不同。
push_back
的特性
#
push_back(c)
函數會將一個字元加到字串的尾端。這個操作通常是 $O(1)$,因為它只修改現有的儲存空間。然而,如果字串容量已滿,就會觸發新的記憶體配置,導致複製現有內容到新空間,時間複雜度為 $O(n)$。
+
運算子的特性
#
使用 +
來連接字串或字元,其效能表現會依據字元插入的位置而異:
s = s + c
(在字串尾端添加一個字元): 通常是 $O(1)$,如果字串仍有足夠容量容納新字元。然而,如果需要重新配置記憶體,複雜度會上升至 $O(n)$,因為需要重新分配空間並複製內容。s = c + s
(在字串開頭插入一個字元): 這個操作會建立一個新的std::string
實例,先複製c
,再將s
加到後面。由於必須將整個原始字串複製到新空間,因此時間複雜度為 $O(n)$。
總結 #
操作 | 時間複雜度 |
---|---|
s.push_back(c) |
$O(1)$(若需重新配置則為 $O(n)$) |
s = s + c |
$O(1)$(若需重新配置則為 $O(n)$) |
s = c + s |
$O(n)$ |
重點總結:
- 在字串尾端添加字元(如
s + c
或push_back
)通常為 $O(1)$。 - 在字串前方插入字元(如
c + s
)會建立新字串,時間複雜度為 $O(n)$。 - 當超過字串容量時,任何修改都可能觸發重新配置記憶體,進而導致 $O(n)$ 的時間成本。
理解這些效能差異對於優化字串操作至關重要,特別是在頻繁進行串接操作的情境下。若要提升效率,應儘量避免在字串開頭插入字元,以減少不必要的記憶體配置與資料複製。
感謝閱讀!歡迎留下你的想法與回饋。