首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

C++ STL 容器類全景解析:分類、特點與選型指南

     編輯:C++ 入門

什麼是容器?

容器是一種對象,能持有其他對象或指針,並提供管理這些元素的方法。核心優勢:
• 自動內存管理 (擴容/縮容)
• 豐富的通用算法接口 (插入、刪除、查找、排序)
• 代碼復用,避免重複造輪子

STL 容器三大類

1. 順序容器 (Sequence Containers)

元素按插入順序線性排列,位置由操作時間/地點決定,非按值排序。
核心特點:隨機訪問或順序訪問,插入刪除效率因結構而異。

容器底層結構隨機訪問頭部插刪尾部插刪中間插刪典型場景
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)文本處理

2. 關聯容器 (Associative Containers)

基於紅黑樹 (有序) 或哈希表 (無序),按鍵值存取,自動排序/去重。
關鍵差異:鍵值分離 (map/set) vs 僅鍵 (set)。

容器底層有序鍵值重複鍵查找/插刪
setRB-tree是鍵=值否O(log n)
multisetRB-tree是鍵=值是O(log n)
mapRB-tree是鍵≠值否O(log n)
multimapRB-tree是鍵≠值是O(log n)
unordered_setHash table否鍵=值否O(1) 平均
unordered_mapHash table否鍵≠值否O(1) 平均

3. 容器適配器 (Container Adapters)

封裝底層容器 (默認 deque/vector) 提供特定接口,不支持迭代器遍歷。
• stack:LIFO,push/pop/top
• queue:FIFO,push/pop/front/back
• priority_queue:最大堆,push/pop/top

選型決策樹

  1. 需按鍵快速查找 → 關聯容器
      • 需有序遍歷 → map/set
      • 無序、極致查找速度 → unordered_map/set (注意自定義 hash)
  2. 需順序存取、隨機訪問 → vector (首選)
  3. 需雙端高效插刪 → deque
  4. 需頻繁中間插刪、無隨機訪問 → list
  5. 需棧/隊列/優先隊列語義 → 適配器
  6. 固定大小、栈上分配 → array

常見性能陷阱

  • vector 頻繁頭部插入 → 改用 deque 或 list
  • map 大量構造時用 reserve (C++23) 或批量插入 insert(range)
  • unordered_map 自定義類型未提供 hash 導致編譯錯誤或性能差
  • 迭代器失效規則:vector 擴容失效所有,list 仅失效被刪除元素

現代 C++ 最佳實踐

  • 優先 vector,除非有明確理由不用
  • 用 auto + 範圍 for 遍歷
  • 算法優於手寫循環 (find_if, sort, transform)
  • 移動語義避免拷貝:v.push_back(std::move(obj))
  • C++20 span 替代指針+長度傳遞容器視圖
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved