当前位置:首页 > C++ > 正文

C++ deque库详解(从零开始掌握STL双端队列容器)

在C++标准模板库(STL)中,deque(全称 double-ended queue,即“双端队列”)是一种功能强大且高效的容器。它支持在两端快速插入和删除元素,同时还能像数组一样通过下标随机访问元素。本教程将带你从零开始,深入浅出地学习 C++ deque库详解,即使你是编程小白,也能轻松掌握!

C++ deque库详解(从零开始掌握STL双端队列容器) deque库详解 deque容器使用教程 STL deque 双端队列C++ 第1张

什么是 deque?

deque 是 C++ STL 中的一个序列容器,全称为 double-ended queue(双端队列)。与 vector 不同,deque 允许在 前端(头部)和 后端(尾部)都以接近常数时间复杂度进行插入和删除操作。同时,它也支持通过索引(下标)进行随机访问。

关键特性:

  • 支持在首尾两端高效插入/删除(时间复杂度为 O(1))
  • 支持随机访问(如 deq[0]deq[3]
  • 内存不连续(由多个固定大小的缓冲区组成)
  • 不是线程安全的

如何使用 deque?

要使用 deque,首先需要包含头文件 <deque>

#include <iostream>#include <deque>using namespace std;

1. 声明和初始化 deque

// 空 dequedeque<int> dq;// 初始化包含5个元素,值为10deque<int> dq2(5, 10);// 用数组初始化int arr[] = {1, 2, 3};deque<int> dq3(arr, arr + 3);// 拷贝构造deque<int> dq4(dq3);

2. 常用操作函数

下面是一些最常用的 deque容器使用教程 中的核心操作:

  • push_back(x):在尾部插入元素 x
  • push_front(x):在头部插入元素 x
  • pop_back():删除尾部元素
  • pop_front():删除头部元素
  • front():返回首元素引用
  • back():返回尾元素引用
  • size():返回元素个数
  • empty():判断是否为空
  • at(i)[i]:访问第 i 个元素

3. 完整示例代码

#include <iostream>#include <deque>using namespace std;int main() {    deque<int> dq;    // 在尾部添加    dq.push_back(10);    dq.push_back(20);    // 在头部添加    dq.push_front(5);    dq.push_front(1);    // 此时 dq = [1, 5, 10, 20]    cout << "Front: " << dq.front() << endl;  // 输出 1    cout << "Back: " << dq.back() << endl;    // 输出 20    // 遍历 deque    for (int i = 0; i < dq.size(); i++) {        cout << dq[i] << " ";  // 输出 1 5 10 20    }    cout << endl;    // 删除首尾    dq.pop_front();  // 删除 1    dq.pop_back();   // 删除 20    cout << "After pop: ";    for (auto it = dq.begin(); it != dq.end(); ++it) {        cout << *it << " ";  // 输出 5 10    }    cout << endl;    return 0;}

deque 与 vector 的区别

很多初学者会混淆 dequevector。以下是主要区别:

特性 vector deque
内存布局 连续 非连续(分段连续)
头部插入/删除 O(n) O(1)
尾部插入/删除 摊还 O(1) O(1)
随机访问 支持 支持

适用场景

双端队列C++ 特别适合以下场景:

  • 需要频繁在队列两端操作(如滑动窗口算法)
  • 实现栈或队列的变种(如双端队列本身)
  • 不需要内存连续,但需要高效首尾操作

总结

通过本篇 C++ STL deque 教程,你应该已经掌握了 deque 的基本用法、核心操作以及与 vector 的区别。记住:deque 是一个功能全面、性能优秀的容器,尤其适合需要在两端频繁操作的场景。

建议多动手写代码练习,加深理解。祝你在 C++ 编程之路上越走越远!