C++ 常用 STL 容器整理
C++ 常用 STL 容器与函数整理
STL 简介
STL,全称 Standard Template Library,即标准模板库。
常用内容主要包括:
| 类型 | 代表内容 |
|---|---|
| 顺序容器 | vector、deque、list |
| 容器适配器 | stack、queue、priority_queue |
| 关联容器 | set、map、multiset、multimap |
| 无序关联容器 | unordered_set、unordered_map |
| 字符串 | string |
| 工具类型 | pair、tuple |
| 常用算法 | sort、reverse、lower_bound、unique |
竞赛常用万能头文件:
1 |
|
常用容器总览
| 容器 | 特点 | 常见用途 |
|---|---|---|
| vector | 动态数组,支持随机访问 | 存数组、邻接表 |
| deque | 双端队列,头尾都能快速插删 | 滑动窗口、单调队列 |
| stack | 后进先出 | 括号匹配、DFS |
| queue | 先进先出 | BFS |
| priority_queue | 优先队列,默认大根堆 | 贪心、Dijkstra |
| map | 有序键值对 | 计数、映射 |
| unordered_map | 无序键值对,平均更快 | 快速计数、查找 |
| set | 有序去重集合 | 去重、排序、查找 |
| multiset | 有序可重复集合 | 维护可重复数据 |
| unordered_set | 无序去重集合 | 快速判重 |
| string | 字符串 | 文本处理 |
| bitset | 二进制位集合 | 状态压缩、位运算 |
vector
vector 是动态数组,支持随机访问。
1 | vector<int> v; |
常用成员函数
| 函数 | 作用 |
|---|---|
| v.push_back(x) | 尾部插入元素 |
| v.emplace_back(x) | 尾部原地构造元素 |
| v.pop_back() | 删除最后一个元素 |
| v.size() | 返回元素个数 |
| v.empty() | 判断是否为空 |
| v.clear() | 清空所有元素 |
| v.resize(n) | 修改大小为 n |
| v.reserve(n) | 预留容量 |
| v.capacity() | 返回当前容量 |
| v.front() | 返回第一个元素 |
| v.back() | 返回最后一个元素 |
| v[i] | 访问第 i 个元素 |
| v.at(i) | 安全访问,越界会报错 |
| v.begin() | 首元素迭代器 |
| v.end() | 尾后迭代器 |
| v.insert(pos, x) | 在 pos 位置插入 |
| v.erase(pos) | 删除指定位置元素 |
| v.erase(l, r) | 删除区间 [l, r) |
| v.swap(other) | 交换两个 vector |
示例
1 | vector<int> v = {3, 1, 2}; |
复杂度
| 操作 | 复杂度 |
|---|---|
| 随机访问 | O(1) |
| 尾部插入 | 平均 O(1) |
| 中间插入/删除 | O(n) |
deque
deque 是双端队列,支持头尾快速插入删除,也支持随机访问。
deque<int> dq;
常用成员函数
| 函数 | 作用 |
|---|---|
| dq.push_back(x) | 尾部插入 |
| dq.push_front(x) | 头部插入 |
| dq.pop_back() | 删除尾部 |
| dq.pop_front() | 删除头部 |
| dq.front() | 返回队首 |
| dq.back() | 返回队尾 |
| dq[i] | 随机访问 |
| dq.at(i) | 安全随机访问 |
| dq.size() | 元素个数 |
| dq.empty() | 是否为空 |
| dq.clear() | 清空 |
| dq.insert(pos, x) | 指定位置插入 |
| dq.erase(pos) | 删除指定位置 |
| dq.begin() / dq.end() | 迭代器 |
常见用途
1 | deque<int> dq; |
常用于:
| 场景 | 说明 |
|---|---|
| 滑动窗口 | 维护区间最大值/最小值 |
| 单调队列 | 队列内元素保持单调 |
| 双端操作 | 头尾都需要插入删除 |
stack
stack 是栈,特点是 后进先出。
stack
常用成员函数
| 函数 | 作用 |
|---|---|
| st.push(x) | 入栈 |
| st.emplace(x) | 原地构造入栈 |
| st.pop() | 出栈 |
| st.top() | 返回栈顶 |
| st.size() | 元素个数 |
| st.empty() | 是否为空 |
示例
1 | stack<int> st; |
注意:stack 不能随机访问,也不能直接遍历。
queue
queue 是队列,特点是 先进先出。
queue<int> q;
常用成员函数
| 函数 | 作用 |
|---|---|
| q.push(x) | 入队 |
| q.emplace(x) | 原地构造入队 |
| q.pop() | 出队 |
| q.front() | 返回队首 |
| q.back() | 返回队尾 |
| q.size() | 元素个数 |
| q.empty() | 是否为空 |
示例
1 | queue<int> q; |
常用于 BFS。
———
priority_queue
priority_queue 是优先队列,默认是 大根堆。
priority_queue<int> pq;
常用成员函数
| 函数 | 作用 |
|---|---|
| pq.push(x) | 插入元素 |
| pq.emplace(x) | 原地构造插入 |
| pq.pop() | 删除堆顶 |
| pq.top() | 返回堆顶 |
| pq.size() | 元素个数 |
| pq.empty() | 是否为空 |
大根堆
priority_queue<int> pq;
小根堆
priority_queue<int, vector<int>, greater<int>> pq;
示例
1 | priority_queue<int> pq; |
常用于:
| 场景 | 说明 |
|---|---|
| 贪心 | 每次取最大/最小 |
| Dijkstra | 维护当前最短距离 |
| Top K | 维护前 K 大/小 |
map
map 是有序映射,存储键值对:
key -> value
默认按照 key 升序排列。
map<int, int> mp;
常用成员函数
| 函数 | 作用 |
|---|---|
| mp[key] | 访问或创建 key 对应的值 |
| mp.at(key) | 访问 key,不存在会报错 |
| mp.insert({key, value}) | 插入键值对 |
| mp.emplace(key, value) | 原地构造插入 |
| mp.erase(key) | 删除指定 key |
| mp.erase(it) | 删除迭代器位置 |
| mp.find(key) | 查找 key |
| mp.count(key) | 判断 key 是否存在 |
| mp.lower_bound(key) | 第一个 >= key 的位置 |
| mp.upper_bound(key) | 第一个 > key 的位置 |
| mp.size() | 元素个数 |
| mp.empty() | 是否为空 |
| mp.clear() | 清空 |
| mp.begin() / mp.end() | 迭代器 |
示例:统计次数
1 | map<int, int> mp; |
遍历
1 | for(auto x : mp) |
| 写法 | 含义 |
|---|---|
| x.first | key |
| x.second | value |
复杂度:
| 操作 | 复杂度 |
|---|---|
| 插入 | O(log n) |
| 删除 | O(log n) |
| 查找 | O(log n) |
———
unordered_map
unordered_map 是无序映射,不会按照 key 排序,但平均速度更快。
unordered_map<int, int> mp;
常用成员函数
| 函数 | 作用 |
|---|---|
| mp[key] | 访问或创建 |
| mp.insert({key, value}) | 插入 |
| mp.emplace(key, value) | 原地插入 |
| mp.erase(key) | 删除 |
| mp.find(key) | 查找 |
| mp.count(key) | 判断是否存在 |
| mp.size() | 元素个数 |
| mp.empty() | 是否为空 |
| mp.clear() | 清空 |
map 和 unordered_map 对比
| 容器 | 是否有序 | 查找复杂度 | 底层结构 |
|---|---|---|---|
| map | 有序 | O(log n) | 红黑树 |
| unordered_map | 无序 | 平均 O(1) | 哈希表 |
———
set
set 是有序集合,自动去重。
set<int> s;
常用成员函数
| 函数 | 作用 |
|---|---|
| s.insert(x) | 插入元素 |
| s.emplace(x) | 原地插入 |
| s.erase(x) | 删除值为 x 的元素 |
| s.erase(it) | 删除迭代器位置 |
| s.find(x) | 查找元素 |
| s.count(x) | 判断元素是否存在 |
| s.lower_bound(x) | 第一个 >= x 的位置 |
| s.upper_bound(x) | 第一个 > x 的位置 |
| s.size() | 元素个数 |
| s.empty() | 是否为空 |
| s.clear() | 清空 |
| s.begin() / s.end() | 迭代器 |
示例
1 | set<int> s; |
输出:
1 3
、multiset
multiset 是有序集合,但允许重复元素。
multiset<int> s;
常用函数
| 函数 | 作用 |
|---|---|
| s.insert(x) | 插入 |
| s.erase(x) | 删除所有值为 x 的元素 |
| s.erase(it) | 删除某一个位置的元素 |
| s.find(x) | 查找 |
| s.count(x) | 统计出现次数 |
| s.lower_bound(x) | 第一个 >= x 的位置 |
| s.upper_bound(x) | 第一个 > x 的位置 |
删除一个元素
1 | auto it = s.find(x); |
注意:
s.erase(x);
会删除所有值为 x 的元素。
unordered_set
unordered_set 是无序集合,自动去重,平均查找速度快。
unordered_set<int> s;
常用成员函数
| 函数 | 作用 |
|---|---|
| s.insert(x) | 插入 |
| s.erase(x) | 删除 |
| s.find(x) | 查找 |
| s.count(x) | 判断是否存在 |
| s.size() | 元素个数 |
| s.empty() | 是否为空 |
| s.clear() | 清空 |
适合只需要快速判断某个元素是否出现过的场景。
string
string 是字符串类,比字符数组更方便。
string s = "hello";
常用成员函数
| 函数 | 作用 |
|---|---|
| s.size() / s.length() | 字符串长度 |
| s.empty() | 是否为空 |
| s.clear() | 清空 |
| s[i] | 访问字符 |
| s.at(i) | 安全访问 |
| s.front() | 第一个字符 |
| s.back() | 最后一个字符 |
| s.push_back(c) | 尾部添加字符 |
| s.pop_back() | 删除最后一个字符 |
| s += t | 拼接字符串 |
| s.append(t) | 拼接字符串 |
| s.insert(pos, t) | 插入字符串 |
| s.erase(pos, len) | 删除子串 |
| s.replace(pos, len, t) | 替换子串 |
| s.substr(pos, len) | 截取子串 |
| s.find(t) | 查找第一次出现位置 |
| s.rfind(t) | 查找最后一次出现位置 |
| s.c_str() | 转成 C 风格字符串 |
示例
1 | string s = "abcdef"; |
pair
pair 用来存储两个值。
pair<int, int> p = {1, 2};
常用写法
1 | cout << p.first; |
示例
1 | vector<pair<int, int>> v; |
pair 默认排序规则:
| 优先级 | 规则 |
|---|---|
| 第一关键字 | 按 first 排序 |
| 第二关键字 | first 相同,按 second 排序 |
———
bitset
bitset 是固定长度的二进制位集合。
1 | bitset<8> b; |
常用成员函数
| 函数 | 作用 |
|---|---|
| b.set() | 全部置为 1 |
| b.set(pos) | 指定位置置为 1 |
| b.reset() | 全部置为 0 |
| b.reset(pos) | 指定位置置为 0 |
| b.flip() | 全部取反 |
| b.flip(pos) | 指定位置取反 |
| b.count() | 统计 1 的个数 |
| b.any() | 是否存在 1 |
| b.none() | 是否全为 0 |
| b.all() | 是否全为 1 |
| b.test(pos) | 判断某位是否为 1 |
| b.to_string() | 转字符串 |
| b.to_ulong() | 转整数 |
示例
1 | bitset<8> b(5); |
常用 algorithm 函数
使用算法函数需要:
#include <algorithm>
如果使用:
#include <bits/stdc++.h>
则不需要额外包含。
常用函数表
| 函数 | 作用 |
|---|---|
| sort(l, r) | 排序 |
| stable_sort(l, r) | 稳定排序 |
| reverse(l, r) | 翻转 |
| unique(l, r) | 去除连续重复元素 |
| lower_bound(l, r, x) | 第一个 >= x 的位置 |
| upper_bound(l, r, x) | 第一个 > x 的位置 |
| binary_search(l, r, x) | 判断是否存在 |
| max(a, b) | 最大值 |
| min(a, b) | 最小值 |
| max_element(l, r) | 最大元素位置 |
| min_element(l, r) | 最小元素位置 |
| swap(a, b) | 交换 |
| next_permutation(l, r) | 下一个排列 |
| prev_permutation(l, r) | 上一个排列 |
| count(l, r, x) | 统计出现次数 |
| find(l, r, x) | 查找元素 |
| fill(l, r, x) | 区间填充 |
示例
1 | vector<int> v = {1, 2, 2, 3, 4}; |
numeric 常用函数
需要头文件:
#include <numeric>
常用函数
| 函数 | 作用 |
|---|---|
| accumulate(l, r, init) | 区间求和 |
| gcd(a, b) | 最大公约数 |
| lcm(a, b) | 最小公倍数 |
| iota(l, r, start) | 递增赋值 |
示例
1 | vector<int> v = {1, 2, 3, 4}; |
容器选择建议
| 需求 | 推荐容器 |
|---|---|
| 动态数组 | vector |
| 头尾插入删除 | deque |
| 后进先出 | stack |
| 先进先出 | queue |
| 每次取最大值/最小值 | priority_queue |
| 键值映射并保持有序 | map |
| 快速键值映射 | unordered_map |
| 去重并排序 | set |
| 可重复并排序 | multiset |
| 快速去重 | unordered_set |
| 字符串处理 | string |
| 二进制状态处理 | bitset |
| 存两个相关数据 | pair |
常见注意事项
1. map[key] 会自动创建元素
1 | map<int, int> mp; |
如果 100 不存在,会自动创建:
mp[100] = 0;
如果只是判断是否存在,建议用:
1 | if(mp.count(100)) |
2. pop() 不会返回元素
错误写法:
int x = q.pop(); // 错误
正确写法:
1 | int x = q.front(); |
3. unique 需要配合 erase
1 | sort(v.begin(), v.end()); |
unique 只会把重复元素移到后面,不会真正删除。
4. lower_bound 和 upper_bound 要求有序
1 | sort(v.begin(), v.end()); |
如果数组没有排序,二分结果没有意义。
总结
STL 可以大幅减少手写数据结构的时间。
| 类型 | 推荐掌握程度 |
|---|---|
| vector | 必须熟练 |
| queue / stack | 必须熟练 |
| map / set | 必须熟练 |
| priority_queue | 必须熟练 |
| unordered_map / unordered_set | 建议熟练 |
| deque / bitset | 常见题型需要掌握 |
| algorithm 常用函数 | 必须熟练 |
- 标题: C++ 常用 STL 容器整理
- 作者: GoodNut
- 创建于 : 2026-05-20 19:47:54
- 更新于 : 2026-05-20 20:16:18
- 链接: https://ddmaster2608.github.io/2026/05/20/C++ 常用 STL 容器整理/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。