STL 常用容器速查表

操作用法时间
尾插v.push_back(x)O(1) 均摊
尾删v.pop_back()O(1)
插入v.insert(it, x)O(n)
删除v.erase(it)O(n)
访问v[i] / v.at(i)O(1)
大小v.size() / v.capacity()O(1)
清空v.clear()O(n)
预留v.reserve(n)O(n)

特点: 连续内存,随机访问快,中间插入慢,尾插最快


操作用法
头插dq.push_front(x)
头删dq.pop_front()
尾插dq.push_back(x)
尾删dq.pop_back()
访问dq[i]

特点: 头尾都能 O(1) 插入删除,随机访问比 vector 慢一点


操作用法
插入lst.insert(it, x)
删除lst.erase(it)
头插lst.push_front(x)
尾插lst.push_back(x)
排序lst.sort()
反转lst.reverse()

特点: 任意位置 O(1) 插入删除,但不能随机访问,用得少


特性mapunordered_map
底层红黑树哈希表
有序✅ 按 key 排序❌ 无序
插入O(log n)O(1) 均摊
查询O(log n)O(1) 均摊
遍历有序输出无序

常用操作:

1
2
3
4
5
mp[key] = val;       // 插入/修改
mp.count(key);       // 是否存在
mp.find(key);        // 返回迭代器
mp.erase(key);       // 删除
for (auto& [k, v] : mp) { }  // C++17 结构化绑定

特性setunordered_set
底层红黑树哈希表
有序✅❌
去重✅✅

常用操作:

1
2
3
4
st.insert(x);
st.erase(x);
st.count(x);    // 0 或 1
st.size();

允许重复 key 的版本,用法基本一样。

multiset 注意: erase(val) 会删掉所有等于 val 的元素,删单个要用 erase(iterator)

1
2
auto it = ms.find(val);
if (it != ms.end()) ms.erase(it);  // 只删一个

1
2
3
4
5
6
stack<int> st;
st.push(x);    // 压栈
st.pop();      // 弹栈(无返回值)
st.top();      // 栈顶
st.empty();
st.size();

底层默认是 deque。


1
2
3
4
5
6
7
queue<int> q;
q.push(x);     // 入队
q.pop();       // 出队(无返回值)
q.front();     // 队首
q.back();      // 队尾
q.empty();
q.size();

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
// 默认大顶堆
priority_queue<int> pq;

// 小顶堆
priority_queue<int, vector<int>, greater<int>> minHeap;

pq.push(x);    // 插入
pq.pop();      // 弹出堆顶
pq.top();      // 堆顶元素
pq.empty();
pq.size();

默认是大顶堆,用 less<int> 比较。


需求推荐容器
随机访问多,尾插尾删vector
头尾都要插入删除deque
频繁中间插入删除list(很少用)
key-value 查找,需要有序map
key-value 查找,追求速度unordered_map
去重 + 有序set
去重 + 速度unordered_set
栈操作stack
队列操作queue
求最大/最小值priority_queue

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#include <algorithm>

sort(v.begin(), v.end());           // 排序
sort(v.rbegin(), v.rend());         // 降序
reverse(v.begin(), v.end());        // 反转
swap(a, b);                         // 交换
*max_element(v.begin(), v.end());   // 最大值
*min_element(v.begin(), v.end());   // 最小值
accumulate(v.begin(), v.end(), 0);  // 求和(需 include <numeric>)
lower_bound(v.begin(), v.end(), x); // 第一个 >= x
upper_bound(v.begin(), v.end(), x); // 第一个 > x
next_permutation(v.begin(), v.end()); // 下一个排列
fill(v.begin(), v.end(), val);      // 填充

容器插入删除
vector扩容全部失效;否则插入点之后失效删除点及之后失效
deque头尾插入只失效所有迭代器,引用不失效;中间插入全部失效中间删除全部失效;头尾删除对应端失效
list / map / set不失效只有被删的失效

相关内容