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

下面是 C++ STL 中 std::deque(双端队列) 的全部常用用法,已分类整理并覆盖其几乎所有成员函数与典型应用,适合你作为一份“用法大全”参考。


一、基础定义与构造

#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()); // 迭代器范围构造

二、插入与删除操作

➤ 插入

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的内容

➤ 删除

d.pop_back();              // 删除末尾元素
d.pop_front();             // 删除头部元素
d.erase(d.begin());        // 删除指定位置
d.erase(d.begin(), d.begin() + 2); // 删除区间
d.clear();                 // 清空所有元素

三、访问元素

d[i];                      // 下标访问,不检查越界
d.at(i);                   // 有越界检查
d.front();                 // 第一个元素
d.back();                  // 最后一个元素

四、迭代器

d.begin(), d.end();        // 正向迭代器
d.rbegin(), d.rend();      // 反向迭代器
cbegin(), cend();          // 常量迭代器

五、容量与状态

d.empty();                 // 是否为空
d.size();                  // 当前元素个数
d.max_size();              // 最大可容纳元素数
d.resize(10);              // 调整大小,多出部分默认值填充
d.resize(10, -1);          // 调整大小,多出部分填充为-1
d.shrink_to_fit();         // 通常无效果在deque上

六、赋值与交换

std::deque<int> d2 = d1;   // 赋值
d2.assign(5, 100);         // 用5个100覆盖
d2.assign(d1.begin(), d1.end()); // 用另一个区间赋值
d.swap(d2);                // 交换两个deque内容

七、其他实用函数

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>

八、典型应用示例

示例:滑动窗口最大值(单调队列)

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)
内存连续性 连续 分段(非连续)
用作队列 不推荐 非常推荐(特别是双端队列应用)

如果你需要类似 listvector 的全部用法,也可以告诉我,我可以继续整理。是否需要我生成一份 PDF 或 Markdown 文档格式的备查版本?