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

STL 容器完全指南:vector、deque、list、stack、queue、set、map 核心特性與實戰用法

     編輯:關於C++

STL 容器分類概覽

類別容器底層結構核心特點典型場景
序列容器vector動態數組隨機訪問 O(1),尾部增刪 O(1) 攤還,中間增刪 O(n)首選容器,需快速隨機訪問
deque雙端隊列 (分段連續)雙端增刪 O(1),隨機訪問 O(1),中間增刪 O(n)需雙端操作,或大對象避免 vector 擴容拷貝
list雙向鏈表任意位置增刪 O(1),無隨機訪問,內存分散頻繁中間增刪,不需隨機訪問
容器適配器stack默認 dequeLIFO,僅 top/push/pop/empty/size,無迭代器函數調用棧、表達式求值、DFS
queue默認 dequeFIFO,front/back/push/pop/empty/size,無迭代器BFS、任務調度、緩衝區
關聯容器set/multiset紅黑樹有序、唯一/允許重復,查找/增刪 O(log n)去重、有序集合、區間查詢
map/multimap紅黑樹鍵值對、按鍵有序、唯一/允許重復鍵,查找/增刪 O(log n)字典、鍵值映射、統計頻次

序列容器詳解與代碼示例

1. vector - 動態數組

vector結構圖
#include <vector> <iostream>
using namespace std;

int main() {
    vector v;
    // 插入
    for (int i=0; i<10; ++i) v.push_back(i);
    
    // 遍歷 (三種方式)
    for (auto it=v.begin(); it!=v.end(); ++it) cout << *it << ' ';
    for (int x : v) cout << x << ' ';           // C++11 範圍 for
    for (size_t i=0; i v1(v);
    return 0;
}

2. deque - 雙端隊列

deque結構圖
#include <deque>
deque q;
q.push_front(3); q.push_back(5); q.push_front(11); // 11 3 5
cout << q.at(2) << ' ' << q.front() << ' ' << q.back() << ' ' << q[1]; // 5 11 5 3

3. list - 雙向鏈表

list結構圖
#include <list>
list l;
l.push_front(12); l.push_front(13); l.push_back(99); // 13 12 99
for (auto x : l) cout << x << ' ';
cout << "\nsize: " << l.size() << ", front: " << l.front() << ", back: " << l.back();
// 注意:list 無 operator[]、at(),不支持隨機訪問

容器適配器

4. stack - 先進後出 (LIFO)

stack結構圖
#include <stack>
stack s;
s.push(12); s.push(15); s.push(55);
while (!s.empty()) { cout << s.top() << ' '; s.pop(); } // 55 15 12
// 無迭代器,無法遍歷不彈出

5. queue - 先進先出 (FIFO)

queue結構圖
#include <queue>
queue q;
q.push(3); q.push(6); q.push(9);
while (!q.empty()) { cout << q.front() << ' '; q.pop(); } // 3 6 9

關聯容器

6. set/multiset - 有序集合

#include <set>
set s; // 自動排序、去重
s.insert({11, 1, 22, 66, 88}); // 1 11 22 66 88
// multiset 允許重復元素

// 區間查詢利器
auto it_low = s.lower_bound(22);  // 首個 ≥ 22
auto it_up  = s.upper_bound(22);  // 首個 > 22
auto range  = s.equal_range(22);  // pair

7. map/multimap - 鍵值映射

#include <map>
map m; // key 自動排序、唯一
m.insert({{1,10}, {2,20}, {3,30}});
// multimap 允許相同 key

for (auto& [k, v] : m) // C++17 結構化綁定
    cout << "key: " << k << ", value: " << v << endl;
// 或傳統迭代器
for (auto it=m.begin(); it!=m.end(); ++it)
    cout << it->first << " => " << it->second << endl;

迭代器失效規則速查 (面試必考)

容器操作迭代器失效情況
vectorinsert/push_back若擴容則全部失效,否則插入點及之後失效
vectorerase被刪除點及之後失效
dequeinsert/erase除首尾操作外,全部失效
listinsert/erase僅被刪除元素迭代器失效,其他穩定
set/mapinsert/erase僅被刪除元素迭代器失效,其他穩定

選型決策樹

  1. 需要鍵值映射 → map / unordered_map (無序更快)
  2. 需要唯一性/有序集合 → set / unordered_set
  3. 需要棧/隊列語義 → stack / queue
  4. 需隨機訪問且主要尾部操作 → vector (默認首選)
  5. 需雙端操作或大對象避免拷貝 → deque
  6. 需頻繁中間增刪、不需隨機訪問 → list (現代 C++ 中較少用,常被 vector/deque 替代)

現代 C++ 實戰技巧

  • 預留容量:v.reserve(10000) 避免多次擴容拷貝。
  • 縮容釋放:v.shrink_to_fit() (C++11) 釋放多餘容量。
  • 原地構造:v.emplace_back(args...) 避免臨時對象拷貝/移動。
  • 異構查找 (C++14):map.find(key, less{}) 透明比較器避免構造 key 對象。
  • 節點提取/插入 (C++17):map.extract() / insert(node) 無拷貝移動節點所有權。

熟練掌握各容器特性、迭代器失效規則、現代 API,是高效使用 STL 的關鍵。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved