快轉到主要內容
  1. Posts/

字串中 push_back 和 + 的使用差別

·1 分鐘
Data Structure and Algorithms String C++ String Time-Complexity
目錄

在 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 + cpush_back)通常為 $O(1)$。
  • 在字串前方插入字元(如 c + s)會建立新字串,時間複雜度為 $O(n)$。
  • 當超過字串容量時,任何修改都可能觸發重新配置記憶體,進而導致 $O(n)$ 的時間成本。

理解這些效能差異對於優化字串操作至關重要,特別是在頻繁進行串接操作的情境下。若要提升效率,應儘量避免在字串開頭插入字元,以減少不必要的記憶體配置與資料複製。


感謝閱讀!歡迎留下你的想法與回饋。

相關文章

Leetcode 1749. 任意子陣列的最大絕對和
·1 分鐘
Data Structure and Algorithms LeetCode Solutions Leetcode-Solutions Prefix-Sum
Leetcode 1524. 和為奇數的子陣列數量
·3 分鐘
Data Structure and Algorithms LeetCode Solutions Leetcode-Solutions Dynamic-Programming Prefix-Sum
Leetcode 1261. 從受污染的二元樹中找出元素
·1 分鐘
Data Structure and Algorithms LeetCode Solutions Leetcode-Solutions Dfs