stl中的双端队列
时间: 2025-05-14 13:48:50 浏览: 27
### std::deque 的基本概念
`std::deque` 是 C++ 标准模板库 (STL) 提供的一种双端队列容器,支持高效的头部和尾部插入/删除操作。与 `std::vector` 不同的是,`std::deque` 并不保证连续存储内存布局,而是通过分段管理的方式实现动态扩展[^1]。
---
### 构造函数详解
以下是 `std::deque` 常见的几种构造方式:
#### 默认构造
创建一个空的 `std::deque` 容器。
```cpp
std::deque<int> dq;
```
#### 范围构造
从指定范围 `[begin, end)` 复制元素来初始化一个新的 `std::deque`。
```cpp
std::vector<int> vec = {1, 2, 3};
std::deque<int> dq(vec.begin(), vec.end());
// 结果:dq = {1, 2, 3}
```
#### 初始化列表构造
利用初始值列表快速构建 `std::deque`。
```cpp
std::deque<int> dq = {4, 5, 6};
// 结果:dq = {4, 5, 6}
```
#### n个相同元素构造
创建包含 `n` 个重复元素的 `std::deque`。
```cpp
std::deque<int> dq(5, 7);
// 结果:dq = {7, 7, 7, 7, 7}
```
#### 拷贝构造
基于已有的 `std::deque` 创建新的副本。
```cpp
std::deque<int> dq1 = {8, 9, 10};
std::deque<int> dq2(dq1);
// 结果:dq2 = {8, 9, 10}
```
以上构造方法均提供了灵活的方式来满足不同需求下的初始化场景[^4]。
---
### 主要成员函数
#### 插入与删除
- **push_back**: 尾部插入单个元素。
- **pop_back**: 删除尾部最后一个元素。
- **push_front**: 首部插入单个元素。
- **pop_front**: 删除首部第一个元素。
示例代码如下:
```cpp
std::deque<int> dq;
dq.push_back(1); // 添加到尾部
dq.push_front(0); // 添加到头部
dq.pop_back(); // 移除尾部元素
dq.pop_front(); // 移除头部元素
```
#### 访问元素
- **front**: 获取首个元素(只读访问)。
- **back**: 获取最后一位元素(只读访问)。
- **operator[] / at**: 支持随机访问特定位置上的元素。
注意:虽然可以像数组一样索引访问,但由于内部结构原因,在某些情况下性能不如 `std::vector` 稳定[^3]。
#### 修改大小
- **resize**: 动态调整容量至新尺寸;如果新增加,则填充默认值。
- **clear**: 清空当前所有内容但仍保留分配的空间。
---
### 实现原理概述
`std::deque` 内部通常由一系列固定大小的小块组成,每一块单独负责一段连续区域内的数据存储工作。当发生越界情况时会自动申请额外区块并链接起来形成逻辑上的一整条链表状分布模式。这种设计使得两端增删变得极为迅速,但同时也带来了遍历速度较慢的问题因为每次跨过边界都需要重新定位下一个节点地址从而增加了开销成本。
---
### 应用场合建议
尽管如此,由于其独特的特性决定了它非常适合用来作为其他高级抽象类型比如栈(stack)或者队列(queue)的基础支撑组件之一。而在日常开发过程中除非特别强调需要频繁执行双向操作外一般较少直接选用该类对象实例化变量名进行编程实践当中去替代传统的向量(vector)或者是列表(list)[^2]。
---
阅读全文
相关推荐




















