容器是一種對象,能持有其他對象或指針,並提供管理這些元素的方法。核心優勢:
• 自動內存管理 (擴容/縮容)
• 豐富的通用算法接口 (插入、刪除、查找、排序)
• 代碼復用,避免重複造輪子
元素按插入順序線性排列,位置由操作時間/地點決定,非按值排序。
核心特點:隨機訪問或順序訪問,插入刪除效率因結構而異。
| 容器 | 底層結構 | 隨機訪問 | 頭部插刪 | 尾部插刪 | 中間插刪 | 典型場景 |
|---|---|---|---|---|---|---|
vector | 動態數組 | O(1) | O(n) | O(1) 均攤 | O(n) | 默認首選,需隨機訪問、尾部增刪 |
deque | 分段連續數組 | O(1) | O(1) | O(1) | O(n) | 雙端操作頻繁,需隨機訪問 |
list | 雙向鏈表 | O(n) | O(1) | O(1) | O(1) (已知位置) | 頻繁中間插刪,無隨機訪問 |
forward_list | 單向鏈表 | O(n) | O(1) | O(1) (需尾指針) | O(1) | 極度省內存,單向遍歷 |
array | 固定數組 | O(1) | 不可 | 不可 | 不可 | 編譯期知大小,替代 C 數組 |
string | 動態字符數組 | O(1) | O(n) | O(1) | O(n) | 文本處理 |
基於紅黑樹 (有序) 或哈希表 (無序),按鍵值存取,自動排序/去重。
關鍵差異:鍵值分離 (map/set) vs 僅鍵 (set)。
| 容器 | 底層 | 有序 | 鍵值 | 重複鍵 | 查找/插刪 |
|---|---|---|---|---|---|
set | RB-tree | 是 | 鍵=值 | 否 | O(log n) |
multiset | RB-tree | 是 | 鍵=值 | 是 | O(log n) |
map | RB-tree | 是 | 鍵≠值 | 否 | O(log n) |
multimap | RB-tree | 是 | 鍵≠值 | 是 | O(log n) |
unordered_set | Hash table | 否 | 鍵=值 | 否 | O(1) 平均 |
unordered_map | Hash table | 否 | 鍵≠值 | 否 | O(1) 平均 |
封裝底層容器 (默認 deque/vector) 提供特定接口,不支持迭代器遍歷。
• stack:LIFO,push/pop/top
• queue:FIFO,push/pop/front/back
• priority_queue:最大堆,push/pop/top
map/setunordered_map/set (注意自定義 hash)vector (首選)dequelistarrayvector 頻繁頭部插入 → 改用 deque 或 listmap 大量構造時用 reserve (C++23) 或批量插入 insert(range)unordered_map 自定義類型未提供 hash 導致編譯錯誤或性能差vector 擴容失效所有,list 仅失效被刪除元素vector,除非有明確理由不用auto + 範圍 for 遍歷find_if, sort, transform)v.push_back(std::move(obj))span 替代指針+長度傳遞容器視圖