deque是C++中支持两端O(1)增删和随机访问的序列容器,底层分段连续,适用于滑动窗口等场景;避免频繁中间操作,专用栈/队列优先用stack/queue适配器。

deque(double-ended queue)是C++标准库中支持两端高效插入和删除的序列容器,底层通常以分段连续空间实现,兼顾了vector的随机访问和list的部分插入效率。
初始化与基本构造
支持多种构造方式,无需手动管理内存:
- 空容器:
dequedq; - 指定大小并初始化为默认值:
dequedq(5); // 5个'\0' - 指定大小并赋初值:
dequedq(4, 3.14); // 4个3.14 - 用数组/另一个deque初始化:
int arr[] = {1,2,3}; dequedq(arr, arr+3); - 拷贝构造:
deque或dq2 = dq1; dequedq2(dq1);
常用增删操作(两端为主)
所有在首尾的操作都是常数时间复杂度 O(1),这是deque的核心优势:
- 队尾添加:
dq.push_back(x); - 队首添加:
dq.push_front(x); - 队尾删除:
dq.pop_back(); - 队首删除:
dq.pop_front(); - 清空全部:
dq.clear(); - 插入任意位置(非首尾):
dq.insert(dq.begin() + pos, value);—— 效率低于首尾,但比vector在中间插入略好
访问与遍历方法
支持随机访问,下标和迭代器用法与vector一致:
立即学习“C++免费学习笔记(深入)”;
- 下标访问(不检查边界):
int x = dq[2];或int x = dq.at(2);(带越界检查,抛出out_of_range) - 首尾元素引用:
dq.front()、dq.back()(容器非空时才安全) - 正向遍历:
for (auto it = dq.begin(); it != dq.end(); ++it) {...} - 范围for循环(推荐):
for (const auto& x : dq) {...} - 反向遍历:
for (auto rit = dq.rbegin(); rit != dq.rend(); ++rit) {...}
容量与状态查询
判断是否为空、获取长度、预留空间等:
- 是否为空:
dq.empty() - 当前元素个数:
dq.size() - 最大可容纳数量(理论上限):
dq.max_size() - 预留存储空间(减少多次分配):
dq.reserve(n);—— 注意:deque不保证支持reserve,某些编译器可能忽略该调用;更可靠的是用resize或直接构造时预设大小 - 实际占用内存大小(字节数):
sizeof(deque是固定的小值(仅含控制指针),不代表数据体积;真实数据存于堆上,无直接接口获取总内存占用)
stack或queue,它们默认基于deque实现且接口更清晰。










