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

相关推荐
Evand J13 分钟前
【MATLAB例程,图像降噪滤波9】自适应维纳滑动窗口滤波(Wiener)图像降噪、方法对比,有中文注释
开发语言·图像处理·计算机视觉·matlab·滑动窗口·滤波·降噪
蒸蒸yyyyzwd21 分钟前
机试学习笔记
c++·求职招聘
杜大哥35 分钟前
python程序:如何查看电脑【电池电量的剩余百分比】 和 【是否插入连接着充电器】?
开发语言·python
wuyk55536 分钟前
Python网络爬虫入门到实战 第01章:爬虫到底是什么?原理、流程、合法性、风险全解析(零基础必看)
开发语言·爬虫·python
yurenpai(27届找实习中)43 分钟前
Java 10 的 var 为什么不能随便用?从订单汇总看懂类型推断与泛型陷阱
java·开发语言·java18
shmily麻瓜小菜鸡1 小时前
JS/TS 易踩坑知识点 — 模块化与工程化类
开发语言·javascript·ecmascript
geovindu1 小时前
CSharp: Observer Pattern
开发语言·后端·观察者模式·设计模式·c#·.netcore·行为模式
handler012 小时前
【Linux】线程与虚拟内存的底层世界
linux·运维·服务器·c++·线程·虚拟地址空间·共享内存
郝学胜-神的一滴2 小时前
C++11 工程级应用 09:告别无谓拷贝,解锁高性能移动语义
开发语言·数据结构·c++·vscode·软件工程·visual studio
MC皮蛋侠客3 小时前
OPC UA 系列(一):标准全景与 Python 最小闭环——让第一条设备数据流动起来
开发语言·python·opcua