std::deque是C++ STL中的双端队列,支持头尾高效插入删除,兼具随机访问能力。①包含头文件并用std::deque声明;②常用操作有push_back、push_front、pop_back、pop_front、front、back、size、empty;③支持下标访问和迭代器遍历,at()提供越界检查;④与vector相比,deque在头部插入更快,内存非连续,扩容不影响原有迭代器,但缓存性能略差;⑤适用于需频繁双端操作且要求随机访问的场景,如滑动窗口、任务队列。

在C++中,std::deque(double-ended queue,双端队列)是标准模板库(STL)提供的一个序列容器,支持在头部和尾部高效地插入和删除元素。它结合了vector的部分特性和链表的灵活性,是一种非常实用的数据结构。
deque的基本用法
要使用deque,需要包含头文件
声明一个deque对象的方式如下:
std::deque常用操作包括:
立即学习“C++免费学习笔记(深入)”;
- push_back(e):在尾部添加元素
- push_front(e):在头部添加元素
- pop_back():删除尾部元素
- pop_front():删除头部元素
- front():访问第一个元素
- back():访问最后一个元素
- size():返回元素个数
- empty():判断是否为空
示例代码:
std::dequedq.push_back(10); // [10]
dq.push_front(5); // [5, 10]
dq.push_back(15); // [5, 10, 15]
std::cout dq.pop_front(); // [10, 15]
dq.pop_back(); // [10]
随机访问与迭代器支持
deque支持随机访问,可以通过下标或迭代器访问任意位置的元素,时间复杂度为O(1)。
- dq[i]:访问索引i处的元素(不检查越界)
- dq.at(i):访问索引i处的元素(会做越界检查,越界抛出std::out_of_range)
- 支持begin()/end()、rbegin()/rend()等迭代器操作
示例:
for (size_t i = 0; i std::cout }// 使用迭代器遍历
for (auto it = dq.begin(); it != dq.end(); ++it) {
std::cout }
deque与vector的主要区别
虽然deque和vector都是序列容器,但它们在实现和性能上有明显差异:
- 插入效率:deque在头部插入(push_front)是常数时间,而vector没有此操作,若在头部插入需移动所有元素
- 内存管理:deque不要求连续存储空间,内部由多个固定大小的块组成;vector必须是连续内存
- 扩容代价:vector在容量不足时需重新分配并复制所有数据;deque扩容更平滑,不会使原有迭代器失效(除了被删除元素对应的)
- 随机访问性能:vector通常更快,因为内存连续,缓存友好;deque稍慢,需间接寻址
常见应用场景
deque适合以下情况:
- 需要频繁在两端添加或删除元素,比如实现滑动窗口、任务调度队列
- 不确定数据总量,且不能接受vector频繁realloc带来的性能波动
- 需要类似vector的随机访问能力,同时保留双端操作灵活性
基本上就这些。std::deque是一个功能强大、使用灵活的容器,理解其特性有助于在合适场景选择合适工具。










