双端队列STL
时间: 2025-05-08 19:22:01 浏览: 34
### C++ STL 双端队列 `std::deque` 的使用方法
#### 定义与特点
`std::deque` 是 C++ 标准模板库 (STL) 中的一种序列容器,表示双端队列(double-ended queue)。它的主要特点是支持高效的头部和尾部插入/删除操作。相比于 `std::vector`,虽然两者都提供了随机访问的能力,但 `std::deque` 更适合频繁在两端进行数据操作的场景[^1]。
#### 头文件引入
要使用 `std::deque`,需先包含相应的头文件:
```cpp
#include <deque>
```
#### 基本初始化方式
以下是几种常见的 `std::deque` 初始化方法[^3]:
- 默认构造函数:创建一个空的 `std::deque`。
```cpp
std::deque<int> dq;
```
- 指定大小构造函数:创建具有指定数量元素的 `std::deque`,初始值可选。
```cpp
std::deque<int> dq(5); // 创建含有 5 个默认初始化为 0 的整数
std::deque<int> dq(5, 10); // 创建含有 5 个值均为 10 的整数
```
- 范围构造函数:通过迭代器范围来初始化。
```cpp
std::vector<int> vec = {1, 2, 3};
std::deque<int> dq(vec.begin(), vec.end()); // 将 vector 数据拷贝到 deque
```
#### 主要成员函数
以下是一些常用的操作函数:
##### 插入与删除
- **push_back/pop_back**: 在尾部插入或移除元素。
```cpp
dq.push_back(4); // 向尾部添加元素 4
dq.pop_back(); // 移除尾部最后一个元素
```
- **push_front/pop_front**: 在首部插入或移除元素。
```cpp
dq.push_front(-1); // 向首部添加元素 -1
dq.pop_front(); // 移除首部第一个元素
```
##### 访问元素
- **operator[] 和 at()**: 随机访问特定位置上的元素。
```cpp
int value = dq[2]; // 获取索引为 2 的元素
int safeValue = dq.at(2); // 类似于 operator[], 提供越界检查
```
- **front/back**: 分别获取首部和尾部的第一个元素。
```cpp
int firstElement = dq.front();
int lastElement = dq.back();
```
##### 迭代遍历
可以像其他 STL 容器一样使用迭代器遍历 `std::deque`:
```cpp
for(auto it = dq.begin(); it != dq.end(); ++it){
std::cout << *it << " ";
}
// 或者基于范围的 for 循环
for(const auto& elem : dq){
std::cout << elem << " ";
}
```
##### 修改容量
- **resize**: 改变容器中的元素数目。
```cpp
dq.resize(8, 99); // 如果当前长度小于 8,则新增部分填充为 99;如果大于 8 则截断多余的部分
```
- **clear**: 清空所有元素。
```cpp
dq.clear();
```
#### 示例程序
下面是一个综合使用的例子,展示如何向 `std::deque` 添加、删除以及打印其内容:
```cpp
#include <iostream>
#include <deque>
int main(){
std::deque<int> dq;
// 插入一些元素
dq.push_back(1);
dq.push_back(2);
dq.push_front(0);
// 打印 deque 内容
std::cout << "Deque content: ";
for(const auto& elem : dq){
std::cout << elem << " "; // 输出应为 0 1 2
}
std::cout << "\n";
// 删除元素
dq.pop_back();
dq.pop_front();
// 再次打印剩余内容
std::cout << "After removals: ";
for(const auto& elem : dq){
std::cout << elem << " "; // 输出应为 1
}
return 0;
}
```
阅读全文
相关推荐



















