C++ STL 容器操作复杂度速查表
以下复杂度基于标准规定的渐进上界(Big-O),其中 n 为容器元素个数。
一、序列容器(Sequence Containers)
1. std::array
| 操作 | 最好 | 平均 | 最坏 | 说明 |
|---|
| 增(赋值/填充) | O(1) | O(n) | O(n) | 整体赋值/初始化需遍历 |
| 删 | — | — | — | 固定大小,无插入删除 |
| 改 | O(1) | O(1) | O(1) | 通过下标直接访问 |
| 查 | O(1) | O(1) | O(1) | 随机访问;线性查找 O(n) |
2. std::vector
| 操作 | 最好 | 平均 | 最坏 | 说明 |
|---|
增(尾部 push_back) | O(1) | O(1) 均摊 | O(n) | 扩容时重新分配并搬移全部元素 |
增(中间/头部 insert) | O(1) | O(n) | O(n) | 需搬移后续元素 |
删(尾部 pop_back) | O(1) | O(1) | O(1) | 仅析构最后一个元素 |
删(中间/头部 erase) | O(1) | O(n) | O(n) | 需搬移后续元素填补空洞 |
| 改 | O(1) | O(1) | O(1) | 通过下标或迭代器直接修改 |
| 查(随机访问) | O(1) | O(1) | O(1) | operator[] / at |
查(按值 find) | O(1) | O(n) | O(n) | 线性查找 |
3. std::deque
| 操作 | 最好 | 平均 | 最坏 | 说明 |
|---|
| 增(头/尾) | O(1) | O(1) | O(1) | 分块存储,两端直接扩展 |
增(中间 insert) | O(1) | O(n) | O(n) | 需搬移一侧全部元素 |
| 删(头/尾) | O(1) | O(1) | O(1) | pop_front / pop_back |
删(中间 erase) | O(1) | O(n) | O(n) | 同 insert |
| 改 | O(1) | O(1) | O(1) | 随机访问与 vector 同级 |
| 查(随机访问) | O(1) | O(1) | O(1) | operator[] / at |
查(按值 find) | O(1) | O(n) | O(n) | 线性查找 |
4. std::list
| 操作 | 最好 | 平均 | 最坏 | 说明 |
|---|
增(已知位置 insert) | O(1) | O(1) | O(1) | 双向链表,插入本身只改指针 |
| 增(未知位置,需查找) | O(1) | O(n) | O(n) | 查找耗时 |
删(已知位置 erase) | O(1) | O(1) | O(1) | 仅调整前后节点指针 |
| 删(未知位置,需查找) | O(1) | O(n) | O(n) | 查找耗时 |
| 改 | O(1) | O(1) | O(1) | 通过迭代器直接修改 |
查(按值 find) | O(1) | O(n) | O(n) | 线性遍历 |
| 查(按位置访问) | O(n) | O(n) | O(n) | 不支持随机访问,只能顺序遍历 |
5. std::forward_list
| 操作 | 最好 | 平均 | 最坏 | 说明 |
|---|
增(头部 push_front) | O(1) | O(1) | O(1) | 单向链表,头插最高效 |
增(已知位置后 insert_after) | O(1) | O(1) | O(1) | 只改后继指针 |
| 增(未知位置) | O(1) | O(n) | O(n) | 需遍历找到前驱 |
删(头部 pop_front) | O(1) | O(1) | O(1) | 直接修改头指针 |
删(已知位置后 erase_after) | O(1) | O(1) | O(1) | 只改后继指针 |
| 删(未知位置) | O(1) | O(n) | O(n) | 需遍历找到前驱 |
| 改 | O(1) | O(1) | O(1) | 迭代器直接修改 |
| 查 | O(1) | O(n) | O(n) | 线性遍历 |
二、关联容器(Associative Containers)—— 红黑树
底层均为平衡二叉搜索树(通常为红黑树),元素按 Key 有序排列。
std::set / std::multiset / std::map / std::multimap
| 操作 | 最好 | 平均 | 最坏 | 说明 |
|---|
增(insert / emplace) | O(1) | O(log n) | O(log n) | 树高平衡,查找插入点耗时 log n |
删(已知迭代器 erase) | O(1) | O(1) | O(1) | 仅调整树结构,不查找 |
删(按 Key erase(key)) | O(1) | O(log n) | O(log n) | 先查找再删除 |
改(map 通过 operator[] / at) | O(1) | O(log n) | O(log n) | 先查找定位 |
查(find / count / lower_bound) | O(1) | O(log n) | O(log n) | 二叉搜索 |
| 遍历 | — | O(n) | O(n) | 中序遍历 |
三、无序关联容器(Unordered Associative Containers)—— 哈希表
底层为哈希表,元素无序。
std::unordered_set / unordered_multiset / unordered_map / unordered_multimap
| 操作 | 最好 | 平均 | 最坏 | 说明 |
|---|
增(insert / emplace) | O(1) | O(1) | O(n) | 哈希冲突严重时退化为链表/树遍历 |
删(已知迭代器 erase) | O(1) | O(1) | O(1) | 直接删除节点 |
删(按 Key erase(key)) | O(1) | O(1) | O(n) | 先哈希定位 |
改(operator[] / at) | O(1) | O(1) | O(n) | 先哈希定位 |
查(find / count) | O(1) | O(1) | O(n) | 最坏情况:所有元素哈希到同一桶 |
| 遍历 | — | O(n) | O(n) | 遍历所有桶及其链表/树 |
最坏情况说明:当哈希函数极差或遭遇哈希碰撞攻击时,查找退化为 O(n)。C++11 起通常采用 桶内红黑树 或 链表+再哈希 来缓解,但标准仍规定最坏 O(n)。
四、容器适配器(Container Adapters)
适配器本身不直接实现数据结构,而是封装上述容器。
1. std::stack(默认基于 deque)
| 操作 | 最好 | 平均 | 最坏 | 说明 |
|---|
增(push) | O(1) | O(1) | O(1) | 底层容器尾部操作 |
删(pop) | O(1) | O(1) | O(1) | 底层容器尾部操作 |
| 改 | — | — | — | 不提供直接修改接口 |
查(top) | O(1) | O(1) | O(1) | 访问栈顶元素 |
2. std::queue(默认基于 deque)
| 操作 | 最好 | 平均 | 最坏 | 说明 |
|---|
增(push / emplace) | O(1) | O(1) | O(1) | 尾部入队 |
删(pop) | O(1) | O(1) | O(1) | 头部出队 |
| 改 | — | — | — | 不提供直接修改接口 |
查(front / back) | O(1) | O(1) | O(1) | 访问队头/队尾 |
3. std::priority_queue(默认基于 vector + 堆)
| 操作 | 最好 | 平均 | 最坏 | 说明 |
|---|
增(push) | O(1) | O(log n) | O(log n) | 堆上滤(percolate up) |
删(pop) | O(1) | O(log n) | O(log n) | 堆下滤(percolate down) |
| 改 | — | — | — | 不提供直接修改接口 |
查(top) | O(1) | O(1) | O(1) | 堆顶即最大/最小元素 |
五、std::string(参考)
| 操作 | 最好 | 平均 | 最坏 | 说明 |
|---|
增(尾部 += / append / push_back) | O(1) | O(1) 均摊 | O(n) | 类似 vector,可能重新分配 |
增(中间 insert) | O(1) | O(n) | O(n) | 需搬移后续字符 |
删(erase / pop_back) | O(1) | O(n) | O(n) | 尾部 O(1),中间/头部 O(n) |
改(operator[]) | O(1) | O(1) | O(1) | 随机访问 |
查(find / rfind) | O(1) | O(n) | O(n) | 字符串匹配 |
查(compare / substr) | O(1) | O(n) | O(n) | 线性比较/拷贝 |
六、总览速查图
┌─────────────────┬──────────┬──────────┬──────────┐
│ 容器 │ 增 │ 删 │ 查 │
├─────────────────┼──────────┼──────────┼──────────┤
│ array │ — │ — │ O(1) │
│ vector │ O(1)/O(n)│ O(1)/O(n)│ O(1) │
│ deque │ O(1)/O(n)│ O(1)/O(n)│ O(1) │
│ list │ O(1) │ O(1) │ O(n) │
│ forward_list │ O(1) │ O(1) │ O(n) │
│ set/map │ O(log n) │ O(log n) │ O(log n) │
│ unordered_set │ O(1)/O(n)│ O(1)/O(n)│ O(1)/O(n)│
│ stack │ O(1) │ O(1) │ O(1) │
│ queue │ O(1) │ O(1) │ O(1) │
│ priority_queue │ O(log n) │ O(log n) │ O(1) │
└─────────────────┴──────────┴──────────┴──────────┘
注:O(1)/O(n) 表示最好/平均 O(1),最坏 O(n)
声明:本文档由 AI(Moonshot AI / Kimi)辅助生成,内容仅供参考,请根据实际情况核实和使用。