C++:std::deque简介

std::deque 是 C++ 标准模板库(STL)中的一个双端队列(Double-ended Queue)容器。它是一种动态数组,允许快速地在序列的两端插入和删除元素,同时支持随机访问。

特点

  1. 双端操作

    支持在队列头部尾部快速插入和删除元素,复杂度为 O(1)
  2. 随机访问

    提供与 std::vector 类似的随机访问功能,支持 operator[] 和 at() 方法。
  3. 动态扩展

    不像 std::vector 使用连续内存块,std::deque 使用一系列的小内存块组成。它可以高效地动态扩展,而不需要像 std::vector 那样重新分配和拷贝。
  4. 迭代器有效性

    插入或删除不会使其他元素的迭代器失效,除非操作的是两端。
  5. 性能

    在两端插入、删除时性能优于 std::vector,但中间插入或删除性能略逊于 std::vector

常用接口

构造函数

#include <deque>
std::deque<int> d1;               // 默认构造空 deque
std::deque<int> d2(5, 10);        // 创建 5 个值为 10 的元素
std::deque<int> d3{1, 2, 3};      // 使用列表初始化
std::deque<int> d4(d3.begin(), d3.end()); // 从迭代器范围初始化

元素访问

std::deque<int> d = {1, 2, 3, 4};
std::cout << d[0] << std::endl;   // 访问第一个元素 (不检查越界)
std::cout << d.at(1) << std::endl; // 访问第 2 个元素 (检查越界)
std::cout << d.front() << std::endl; // 返回第一个元素
std::cout << d.back() << std::endl;  // 返回最后一个元素

修改操作

std::deque<int> d;
d.push_back(1);           // 尾部插入 1
d.push_front(2);          // 头部插入 2
d.pop_back();             // 移除尾部元素
d.pop_front();            // 移除头部元素

d.insert(d.begin() + 1, 3); // 在指定位置插入 3
d.erase(d.begin());        // 移除指定位置的元素
d.clear();                 // 清空所有元素

大小操作

std::deque<int> d = {1, 2, 3};
std::cout << d.size() << std::endl;    // 返回元素个数
std::cout << d.empty() << std::endl;  // 判断是否为空

排序

#include <algorithm>
std::deque<int> d = {4, 1, 3, 2};
std::sort(d.begin(), d.end()); // 对 deque 排序

遍历

for (auto it = d.begin(); it != d.end(); ++it) {
    std::cout << *it << " ";
}
for (int val : d) {         // 基于范围的循环
    std::cout << val << " ";
}

应用场景

  1. 双端操作的场景

    适用于需要在头尾频繁插入或删除的场景,例如滑动窗口问题。
  2. 替代 std::queue

    虽然 std::queue 是基于 std::deque 实现的,但如果需要随机访问或对队列内容排序,可以直接使用 std::deque
  3. 缓存系统

    由于支持两端高效操作,std::deque 常用于实现 LRU 缓存等机制。

举例:

#include <deque>
#include <iostream>

int main() {
    std::deque<int> dq = {10, 20, 30};

    dq.push_front(5);     // 头部插入
    dq.push_back(40);     // 尾部插入

    std::cout << "Deque: ";
    for (int v : dq) {
        std::cout << v << " ";
    }
    std::cout << std::endl;

    dq.pop_front();       // 移除头部
    dq.pop_back();        // 移除尾部

    std::cout << "After pops: ";
    for (int v : dq) {
        std::cout << v << " ";
    }

    return 0;
}

输出:

Deque: 5 10 20 30 40
After pops: 10 20 30

和 std::vector 的对比

C++中,`std::deque` 是一种双端队列容器,它允许高效的在两端添加和删除元素。如果你想要创建一个多层嵌套的 `std::deque`,每个内部的 deque 的大小都是固定的,你可以这样做: ```cpp #include <deque> // 定义一个模板类来表示多层 deque template <typename T, size_t InnerSize> class MultiLevelDeque { public: // 创建一个三层嵌套的 deque MultiLevelDeque(size_t outerSize) : outerDeque(outerSize) {} private: std::deque<std::deque<std::deque<T, InnerSize>>> outerDeque; }; // 示例:创建一个三层,每层大小为3的 deque int main() { int innerSize = 3; size_t outerSize = 10; MultiLevelDeque<int, innerSize> myDeque(outerSize); // ... // 对外层 deque 进行操作,如添加元素 for (size_t i = 0; i < outerSize; ++i) { for (size_t j = 0; j < innerSize; ++j) { for (size_t k = 0; k < innerSize; ++k) { myDeque.outerDeque[i].push_back({k}); // 添加到内层 deque } } } return 0; } ``` 在这个例子中,`MultiLevelDeque` 类接受一个参数 `T` 和一个内部 deque 的大小 `InnerSize`。初始化时,它会创建一个外部 deque,大小由 `outerSize` 决定,而内部 deque 则保持固定的 `innerSize`。 注意,这只是一个基本的示例,实际应用可能需要更复杂的逻辑来管理多层 deque 中的数据。另外,由于 deque 的内部实现,频繁的添加和删除操作通常比向已知大小的数组插入和删除更快,尤其是当数据分布在多层时。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值