deque 是 STL 中双端队列 容器,全称double-ended queue,结合了vector和list的核心优势:支持随机访问 、头尾两端高效增删元素,是开发中处理双端操作场景的首选容器。本文从基础认知、初始化、核心 API、底层原理、迭代器、容器对比、核心考点七个维度整理,适配学习与面试。
一、deque 基础认知
-
本质 :分段连续内存实现的双端队列,STL 序列式容器。
-
核心特点
- 支持头部、尾部O (1) 时间复杂度增删元素(vector 不支持头部高效操作);
- 支持随机访问 (
[]、at(),和 vector 一致,list 不支持); - 内存管理:分段连续存储,无整体扩容开销;
- 中间插入 / 删除效率低,需要移动元素。
-
头文件
cpp#include <deque> using namespace std;二、deque 的定义与初始化
用法与
vector几乎完全一致,学习成本极低:cpp#include <iostream> #include <deque> using namespace std; int main() { // 1. 空容器 deque<int> d1; // 2. 指定大小,默认值0 deque<int> d2(5); // 3. 指定大小+初始值 deque<int> d3(5, 10); // 4. 列表初始化 deque<int> d4 = {1,2,3,4}; // 5. 拷贝初始化 deque<int> d5(d4); return 0; }三、deque 核心常用 API
1. 元素访问(与 vector 完全一致)
表格
方法 作用 d[i]随机访问,不检查越界 d.at(i)随机访问,越界抛异常 d.front()获取首元素 d.back()获取尾元素 2. 增删元素(双端操作,核心优势)
表格
方法 作用 时间复杂度 push_back(val)尾部插入 O(1) emplace_back(val)尾部原位构造 O(1) pop_back()删除尾部元素 O(1) push_front(val)头部插入 O(1) emplace_front(val)头部原位构造 O(1) pop_front()删除头部元素 O(1) insert(pos, val)指定位置插入 O(n) erase(pos)删除指定位置元素 O(n) clear()清空所有元素 O(n) 3. 容量操作
表格
方法 作用 size()获取元素个数 empty()判断是否为空 resize(n)调整元素数量 reserve()deque 无此方法(无整体扩容)
四、deque 底层原理(面试核心)
deque 不是一整块连续内存,这是和 vector 最大的区别:
-
底层由多个独立的连续内存缓冲区(分段) 组成;
-
维护一个中控器(map 数组),记录所有分段缓冲区的地址;
-
头尾插入元素时,直接开辟新的分段缓冲区,无需拷贝旧数据;
-
逻辑上连续,物理上分段连续。
✅ 优势:无 vector 的扩容开销,头尾增删极致高效;❌ 劣势:中间插入 / 删除需要移动元素,效率低。
五、deque 的迭代器
结合你之前学习的STL 迭代器知识点,deque 迭代器是重点:

- 迭代器类型 :随机访问迭代器 (和 vector 一致,支持
++、--、+n、[]); - 底层实现:封装了中控器 + 分段缓冲区指针(比 vector 迭代器复杂,不是原生指针);
- 遍历用法:与 vector、list 通用,支持迭代器、范围 for、下标遍历;
- 代码示例
六、deque /vector/list 核心对比(面试必背)
表格
| 特性 | vector | deque | list |
|---|---|---|---|
| 内存结构 | 整块连续 | 分段连续 | 非连续(双向链表) |
| 随机访问 | 支持 | 支持 | 不支持 |
| 头部增删 | O (n),低效 | O (1),高效 | O (1),高效 |
| 尾部增删 | O(1) | O(1) | O(1) |
| 中间增删 | O(n) | O(n) | O(1) |
| 迭代器类型 | 随机访问 | 随机访问 | 双向 |
| 迭代器失效 | 扩容 / 插入 / 删除均失效 | 仅中间操作失效 | 仅删除位置失效 |
七、总结(核心考点浓缩)
- deque 是分段连续内存 的双端队列,支持随机访问,头尾增删效率为 O (1);
- 核心 API:
push_front/pop_front是区别于 vector 的关键方法; - 迭代器:随机访问迭代器,底层封装中控器与分段指针,用法与 vector 一致;
- 底层:无整体扩容,多段内存 + 中控器管理,兼顾访问效率与双端操作;
- 迭代器失效:头尾增删不失效,中间插入 / 删除会导致迭代器失效;
- 适用场景:需要头尾频繁操作 、随机访问,替代 vector + 头部操作的场景;
- 面试高频:deque 底层结构、与 vector/list 的区别、迭代器类型、迭代器失效规则。