STL之deque 【双端队列】

本文详细介绍了C++标准库中的deque双端队列,包括如何创建、添加元素、删除元素、修改元素、访问元素以及遍历队列的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

STL之deque 【双端队列】

deque:双端队列是 C++ 标准库中的一种容器,它允许高效地从两端添加和删除元素。deque 是一个动态数组,支持快速随机访问,并且可以在前端和后端高效地执行插入和删除操作。

头文件:

#include <deque>
using namespace std;

创建deque

deque<int>  myDeque;

添加元素

  • push_back(value):在双端队列的末尾插入元素。
  • push_front(value):在双端队列的开头插入元素。
    myDeque.push_back(2);
    myDeque.push_front(1);

删除元素:

  • pop_back():从双端队列的末尾删除元素。
  • pop_front():从双端队列的开头删除元素。
    myDeque.pop_back();//队尾删除
    myDeque.pop_front();//队头删除

        //5.删除指定位置元素,在指定位置插入元素
    deque<int>::iterator it = myDeque.begin();
    advance(it, 2);
    it=myDeque.erase(it);//更新it,返回的是删除元素的原来的索引
    myDeque.insert(it,40);//在刚刚被删除元素的原来位置插入一个新的元素

修改元素:

    myDeque[0] = 20;//可以直接索引修改,索引有可能会越界
    myDeque.at(1) = 30;//可以直接索引修改,会抛出异常

访问元素:

  • at(index):根据索引访问元素,抛出异常以处理越界情况。
  • front():访问队列的第一个元素。
  • back():访问队列的最后一个元素。
    //4.访问元素
    cout << "队列第一个元素:" << myDeque.front() << " 队列最后一个元素:" <<myDeque.back() <<endl;
    cout << "队列第3个元素:" << myDeque.at(2) << endl;

遍历队列deque

    //6.遍历队列
    for (int element : myDeque) {
        cout << element << " ";
    }

综合示例:

#include <iostream>
#include <list>
#include <string>
#include <deque>

using namespace std;

int main() {
    //1.创建队列
    deque<int>  myDeque;

    //2.添加元素
    myDeque.push_back(2);
    myDeque.push_back(3);
    myDeque.push_back(4);
    myDeque.push_back(5);
    myDeque.push_back(6);
    myDeque.push_front(1);

    //3.删除元素
    myDeque.pop_back();//队尾删除
    myDeque.pop_front();//队头删除

    //4.访问元素
    cout << "队列第一个元素:" << myDeque.front() << " 队列最后一个元素:" <<myDeque.back() <<endl;
    cout << "队列第3个元素:" << myDeque.at(2) << endl;

    //5.删除指定位置元素,在指定位置插入元素
    deque<int>::iterator it = myDeque.begin();
    advance(it, 2);
    it=myDeque.erase(it);//更新it,返回的是删除元素的原来的索引
    myDeque.insert(it,40);//在刚刚被删除元素的原来位置插入一个新的元素

    myDeque[0] = 20;//可以直接索引修改,索引有可能会越界
    myDeque.at(1) = 30;//可以直接索引修改,会抛出异常
    //6.遍历队列
    for (int element : myDeque) {
        cout << element << " ";
    }

    return 0;
}

那么deque的用法就讲到这里,下一章看priority_queue的用法。关注我,为大家持续分享更多的内容,让学习变得更简单,与君共勉,共同成长。

### 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]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西里小诸葛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值