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)辅助生成,内容仅供参考,请根据实际情况核实和使用。