目录
🌟 STL容器全景图
核心维度对比:
容器类型 | 内存布局 | 随机访问 | 插入/删除效率 | 迭代器失效风险 | 典型应用场景 |
---|---|---|---|---|---|
vector | 连续 | ✅ O(1) | 尾部O(1) | 扩容时全失效 | 动态数组、高频访问 |
deque | 分块连续 | ✅ O(1) | 头尾O(1) | 部分失效 | 双端队列 |
list | 非连续 | ❌ | 任意O(1) | 不失效 | 链表结构 |
set/map | 树状非连续 | ❌ | O(log n) | 部分失效 | 有序集合/映射 |
priority_queue | 堆结构 | ❌ | O(log n) | 可能失效 | 优先级调度 |
🚀 十大容器速查
1. vector(动态数组)
- 基本概念:
动态数组,内存连续,支持随机访问。元素按插入顺序存储,大小可动态调整,但需重新分配内存时效率较低。- 特点:
- 高效操作:末尾插入/删除元素(
push_back
/pop_back
)为均摊O(1)。- 内存连续:支持下标访问(
[]
或at()
),但中间插入/删除需移动元素,时间复杂度O(n)。- 空间预留:通过
reserve()
预分配内存,减少频繁扩容开销。- 内存管理:
shrink_to_fit()
可尝试缩减内存到实际大小。- 常用操作:
push_back(x)
:尾部添加元素。pop_back()
:删除尾部元素。erase(pos)
:删除指定位置元素(需迭代器)。resize(n)
:调整容器大小。front()
/back()
:访问首尾元素。- 适用场景:
需要频繁访问元素且操作集中在末尾(如动态数组、需要随机访问的场景)。
2. deque(双端队列)
- 基本概念:
双端队列,支持头尾高效插入/删除,内存分块存储(非完全连续)。- 特点:
- 高效操作:头尾插入/删除(
push_front
/pop_front
)为O(1),但中间操作效率低。- 内存结构:由多个固定大小的数组块组成,下标访问需二次解引用,比vector慢。
- 兼容性:接口与vector类似,但常数时间较大。
- 常用操作:
push_front(x)
/push_back(x)
:头/尾添加元素。pop_front()
/pop_back()
:头/尾删除元素。at(i)
/[]
:随机访问元素。- 适用场景:
需要频繁在头尾操作(如队列、双端扩展的动态数组)。