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

相关推荐
旖旎夜光5 分钟前
LeetCode 852:山脉数组的峰顶索引(二分查找) —— 题解
数据结构·c++·算法·leetcode·二分查找
程与留27 分钟前
05_Qt 核心模块概览——Qt Core、Gui、Widgets、Quick 的职责划分
c++·qt
CRMEB定制开发33 分钟前
2026年最值得推荐的10大开源商城系统盘点
开发语言·人工智能·开源·商城系统·小程序商城
buhuizhiyuci1 小时前
【QT-百日筑基篇】修真世界摸爬滚打多年,终于黄天不负有心人,突破炼器中期——常用控件QWight的属性
开发语言·c++·qt·gui·图形化
Littlehero_1212 小时前
QT自定义控件之热换站系统(源码开源)
开发语言·qt
meilindehuzi_a3 小时前
Python 基础语法(1):常量、变量、类型、输入输出与运算符
开发语言·python
caimouse3 小时前
ReactOS 窗口系统分析(5):可见区域与窗口 DC — vis.c + windc.c
c语言·开发语言
OPEN-F3 小时前
Python进阶教程:装饰器与生成器深入
开发语言·python
千里码aicood4 小时前
基于Python的电商数据采集系统(大数据+爬虫)
开发语言·python
_Narcissus_4 小时前
动态规划初探(含完整代码实现)
c语言·数据结构·c++·算法·动态规划·背包问题·最短路径