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

相关推荐
YYYing.几秒前
【设计模式系列 (七) 】桥接模式
c++·后端·设计模式·桥接模式
言乐627 分钟前
Python自动去除水印
开发语言·python·django·virtualenv·pygame
大圣编蚕29 分钟前
C语言入门:基本语法汇总
c语言·开发语言
czq_268671948731 分钟前
Python打卡第31天
开发语言·python
invicinble31 分钟前
python 编程语言 认识维度
开发语言·数据库·python
AC赳赳老秦33 分钟前
数据采集全链路审计留痕:用 OpenClaw 实现合规审计与追溯
开发语言·汇编·python·php·swift·deepseek·openclaw
czhc114007566337 分钟前
退出防呆:用“总闸“收口所有退出入口,以及三个并发语法坑
开发语言·c#
高山有多高1 小时前
【Linux笔记】Linux自定义Shell
linux·c++
悠仁さん1 小时前
【C++】vector 类
开发语言·c++
_upupup1 小时前
智能指针的原理及简单模拟实现(C++)
开发语言·c++