130 lines
3.6 KiB
Markdown
130 lines
3.6 KiB
Markdown
下面是 **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 文档格式的备查版本?
|