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_backO(1)O(1) 均摊O(n)扩容时重新分配并搬移全部元素
(中间/头部 insertO(1)O(n)O(n)需搬移后续元素
(尾部 pop_backO(1)O(1)O(1)仅析构最后一个元素
(中间/头部 eraseO(1)O(n)O(n)需搬移后续元素填补空洞
O(1)O(1)O(1)通过下标或迭代器直接修改
(随机访问)O(1)O(1)O(1)operator[] / at
(按值 findO(1)O(n)O(n)线性查找

3. std::deque

操作最好平均最坏说明
(头/尾)O(1)O(1)O(1)分块存储,两端直接扩展
(中间 insertO(1)O(n)O(n)需搬移一侧全部元素
(头/尾)O(1)O(1)O(1)pop_front / pop_back
(中间 eraseO(1)O(n)O(n)同 insert
O(1)O(1)O(1)随机访问与 vector 同级
(随机访问)O(1)O(1)O(1)operator[] / at
(按值 findO(1)O(n)O(n)线性查找

4. std::list

操作最好平均最坏说明
(已知位置 insertO(1)O(1)O(1)双向链表,插入本身只改指针
(未知位置,需查找)O(1)O(n)O(n)查找耗时
(已知位置 eraseO(1)O(1)O(1)仅调整前后节点指针
(未知位置,需查找)O(1)O(n)O(n)查找耗时
O(1)O(1)O(1)通过迭代器直接修改
(按值 findO(1)O(n)O(n)线性遍历
(按位置访问)O(n)O(n)O(n)不支持随机访问,只能顺序遍历

5. std::forward_list

操作最好平均最坏说明
(头部 push_frontO(1)O(1)O(1)单向链表,头插最高效
(已知位置后 insert_afterO(1)O(1)O(1)只改后继指针
(未知位置)O(1)O(n)O(n)需遍历找到前驱
(头部 pop_frontO(1)O(1)O(1)直接修改头指针
(已知位置后 erase_afterO(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 / emplaceO(1)O(log n)O(log n)树高平衡,查找插入点耗时 log n
(已知迭代器 eraseO(1)O(1)O(1)仅调整树结构,不查找
(按 Key erase(key)O(1)O(log n)O(log n)先查找再删除
map 通过 operator[] / atO(1)O(log n)O(log n)先查找定位
find / count / lower_boundO(1)O(log n)O(log n)二叉搜索
遍历O(n)O(n)中序遍历

三、无序关联容器(Unordered Associative Containers)—— 哈希表

底层为哈希表,元素无序。

std::unordered_set / unordered_multiset / unordered_map / unordered_multimap

操作最好平均最坏说明
insert / emplaceO(1)O(1)O(n)哈希冲突严重时退化为链表/树遍历
(已知迭代器 eraseO(1)O(1)O(1)直接删除节点
(按 Key erase(key)O(1)O(1)O(n)先哈希定位
operator[] / atO(1)O(1)O(n)先哈希定位
find / countO(1)O(1)O(n)最坏情况:所有元素哈希到同一桶
遍历O(n)O(n)遍历所有桶及其链表/树

最坏情况说明:当哈希函数极差或遭遇哈希碰撞攻击时,查找退化为 O(n)。C++11 起通常采用 桶内红黑树链表+再哈希 来缓解,但标准仍规定最坏 O(n)。


四、容器适配器(Container Adapters)

适配器本身不直接实现数据结构,而是封装上述容器。

1. std::stack(默认基于 deque

操作最好平均最坏说明
pushO(1)O(1)O(1)底层容器尾部操作
popO(1)O(1)O(1)底层容器尾部操作
不提供直接修改接口
topO(1)O(1)O(1)访问栈顶元素

2. std::queue(默认基于 deque

操作最好平均最坏说明
push / emplaceO(1)O(1)O(1)尾部入队
popO(1)O(1)O(1)头部出队
不提供直接修改接口
front / backO(1)O(1)O(1)访问队头/队尾

3. std::priority_queue(默认基于 vector + 堆)

操作最好平均最坏说明
pushO(1)O(log n)O(log n)堆上滤(percolate up)
popO(1)O(log n)O(log n)堆下滤(percolate down)
不提供直接修改接口
topO(1)O(1)O(1)堆顶即最大/最小元素

五、std::string(参考)

操作最好平均最坏说明
(尾部 += / append / push_backO(1)O(1) 均摊O(n)类似 vector,可能重新分配
(中间 insertO(1)O(n)O(n)需搬移后续字符
erase / pop_backO(1)O(n)O(n)尾部 O(1),中间/头部 O(n)
operator[]O(1)O(1)O(1)随机访问
find / rfindO(1)O(n)O(n)字符串匹配
compare / substrO(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)辅助生成,内容仅供参考,请根据实际情况核实和使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值