Files
Data-Structure/STL/STL-Deque/README.MD
e2hang 0ea4e65fba STL
2025-08-01 11:20:21 +08:00

130 lines
3.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

下面是 **C++ STL 中 `std::deque`(双端队列)** 的全部常用用法,已分类整理并覆盖其几乎所有成员函数与典型应用,适合你作为一份“用法大全”参考。
---
## ✅ 一、基础定义与构造
```cpp
#include <deque>
std::deque<int> d1; // 空deque
std::deque<int> d2(5); // 包含5个默认值为0的元素
std::deque<int> d3(5, 10); // 包含5个值为10的元素
std::deque<int> d4{1, 2, 3, 4}; // 列表初始化
std::deque<int> d5(d4); // 拷贝构造
std::deque<int> d6(d4.begin(), d4.end()); // 迭代器范围构造
```
---
## ✅ 二、插入与删除操作
### ➤ 插入
```cpp
d.push_back(10); // 末尾插入
d.push_front(5); // 头部插入
d.insert(d.begin() + 1, 6); // 中间插入一个元素
d.insert(d.begin(), 3, 7); // 插入3个7
d.insert(d.end(), d2.begin(), d2.end()); // 插入另一个deque的内容
```
### ➤ 删除
```cpp
d.pop_back(); // 删除末尾元素
d.pop_front(); // 删除头部元素
d.erase(d.begin()); // 删除指定位置
d.erase(d.begin(), d.begin() + 2); // 删除区间
d.clear(); // 清空所有元素
```
---
## ✅ 三、访问元素
```cpp
d[i]; // 下标访问,不检查越界
d.at(i); // 有越界检查
d.front(); // 第一个元素
d.back(); // 最后一个元素
```
---
## ✅ 四、迭代器
```cpp
d.begin(), d.end(); // 正向迭代器
d.rbegin(), d.rend(); // 反向迭代器
cbegin(), cend(); // 常量迭代器
```
---
## ✅ 五、容量与状态
```cpp
d.empty(); // 是否为空
d.size(); // 当前元素个数
d.max_size(); // 最大可容纳元素数
d.resize(10); // 调整大小,多出部分默认值填充
d.resize(10, -1); // 调整大小,多出部分填充为-1
d.shrink_to_fit(); // 通常无效果在deque上
```
---
## ✅ 六、赋值与交换
```cpp
std::deque<int> d2 = d1; // 赋值
d2.assign(5, 100); // 用5个100覆盖
d2.assign(d1.begin(), d1.end()); // 用另一个区间赋值
d.swap(d2); // 交换两个deque内容
```
---
## ✅ 七、其他实用函数
```cpp
std::reverse(d.begin(), d.end()); // 反转
std::sort(d.begin(), d.end()); // 排序
std::find(d.begin(), d.end(), 42); // 查找元素
std::accumulate(d.begin(), d.end(), 0); // 求和(需 #include <numeric>
```
---
## ✅ 八、典型应用示例
### 示例:滑动窗口最大值(单调队列)
```cpp
std::deque<int> window;
for (int i = 0; i < n; ++i) {
while (!window.empty() && nums[i] > nums[window.back()])
window.pop_back();
window.push_back(i);
if (window.front() <= i - k)
window.pop_front();
if (i >= k - 1)
result.push_back(nums[window.front()]);
}
```
---
## ✅ 九、deque 与 vector 的区别(常问)
| 特性 | `vector` | `deque` |
| ------- | --------- | --------------- |
| 插入/删除首端 | 效率低O(n) | 高效O(1) |
| 插入/删除尾端 | 高效O(1) | 高效O(1) |
| 内存连续性 | 连续 | 分段(非连续) |
| 用作队列 | 不推荐 | 非常推荐(特别是双端队列应用) |
---
如果你需要类似 `list``vector` 的全部用法,也可以告诉我,我可以继续整理。是否需要我生成一份 PDF 或 Markdown 文档格式的备查版本?