std::deque 是支持高效两端插入/删除的序列容器,底层采用分段连续空间实现,随机访问和两端操作均为 O(1),但内存不连续、无 data() 函数、开销大于 vector。

std::deque 是 C++ 标准库中支持高效两端插入/删除的序列容器,底层通常以分段连续空间(如小块数组组成的链表)实现,不同于 std::vector 的单一连续内存。它不保证整体内存连续,但随机访问仍为 O(1),两端操作稳定为 O(1),而 vector 只有尾端插入/删除是 O(1),头插或中间插入代价高(需移动大量元素)。
deque 的核心操作与典型用法
deque 支持类似 vector 的接口,但更强调双端操作:
-
push_front() 和 pop_front():在头部快速增删 —— vector 不提供这些操作(
insert(begin(), x)是 O(n)) - push_back() 和 pop_back():尾部操作,和 vector 一样高效
- operator[]、at()、front()、back():支持常数时间随机访问和首尾元素直接读写
- size()、empty()、clear():语义与 vector 完全一致
deque 与 vector 关键差异对比
选择依据主要看操作模式和内存特性:
- 内存布局:deque 内存不连续(可能影响缓存局部性),vector 必须连续 —— 若频繁遍历且对 CPU 缓存敏感(如数值计算),vector 通常更快
- 插入/删除位置:需要频繁在头部操作?选 deque;只在尾部增删?vector 更轻量、更紧凑
-
迭代器稳定性:deque 的迭代器在头部/尾部操作后仍有效(除非对应元素被删),vector 在
push_back()引起扩容时会使所有迭代器失效 - 指针/引用有效性:deque 中元素被插入/删除时,其他元素的地址可能不变,但其指针/引用不一定长期有效(因分段管理),vector 中只要不扩容,已有元素地址始终有效
何时优先选用 deque
常见适用场景包括:
立即学习“C++免费学习笔记(深入)”;
- 实现滑动窗口算法(如最大值队列):需从头取、尾增、头删
- 日志缓冲区或命令历史:新条目追加到尾,旧条目从头淘汰
- BFS 层序遍历中的节点队列:交替从头读、向尾加子节点
- 需要稳定迭代器 + 频繁两端修改的交互式数据结构(如 undo/redo 栈队列混合体)
使用注意点
deque 虽灵活,但有隐含成本和限制:
- 构造、拷贝、赋值开销通常比 vector 大(涉及多段内存管理)
- 不支持 data() 成员函数(因无统一连续首地址),无法直接传给要求
T*的 C 接口 - 迭代器虽可随机跳转,但跨段跳转比 vector 稍慢(一次额外间接寻址)
- 若仅需尾部操作,别为“听起来更高级”而用 deque —— vector 更简单、更高效、更常见










