C++ STL 容器操作复杂度速查表

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

相关推荐
always_TT1 小时前
【Python requirements.txt 依赖管理】
开发语言·python
ziguo11221 小时前
Windows API MessageBox 函数详解
c语言·c++·windows·visualstudio
王老师青少年编程1 小时前
2023年CSP-J初赛真题及答案解析(11-15)
c++·真题·csp-j·答案·csp·初赛·信奥赛
15Moonlight1 小时前
C++进阶(09):特殊类设计
开发语言·c++
宁风NF1 小时前
JavaScript:网络请求与前端通信
开发语言·前端·javascript·网络·学习·ecmascript
皓月斯语2 小时前
B3867 [GESP202309 三级] 小杨的储蓄 题解
c++·算法·题解
techdashen2 小时前
Go设计取舍之三: 0.3ns每次的错误Benchmark
开发语言·后端·golang
rosmis2 小时前
agent各指标定义
android·java·开发语言