C++引用与指针:核心区别全解析

一、deque 是什么

deque 全称:double-ended queue 双端队列特点:

  1. 可以在头部、尾部都快速插入、删除
  2. 支持随机访问 ,像数组一样能用下标 []
  3. 底层不是连续一块内存,是分段连续空间
  4. 相比 vector:头尾操作更快,中间插入依然慢

头文件:

复制代码
#include <deque>
using namespace std;

二、deque 初始化四种方式

复制代码
// 1. 空容器
deque<int> d1;

// 2. 5个元素,默认0
deque<int> d2(5);

// 3. 5个元素,初始值都是8
deque<int> d3(5, 8);

// 4. 直接列表初始化
deque<int> d4 = {1,2,3,4,5};

三、deque 核心增删接口

1. 头尾插入

复制代码
deque<int> d;

d.push_back(10);   // 尾部加
d.push_front(20);  // 头部加
d.push_back(30);

2. 头尾删除

复制代码
d.pop_back();     // 删尾
d.pop_front();    // 删头

3. 取值与修改

支持下标随机访问:

复制代码
cout << d[0];
d[1] = 66;

4. 容量与清空

cpp

运行

复制代码
d.size();         // 元素个数
d.empty();        // 判断是否为空
d.clear();        // 清空所有元素

四、三种遍历方式

1. 下标遍历

复制代码
for(int i = 0; i < d.size(); i++)
{
    cout << d[i] << " ";
}

2. 迭代器遍历(STL 标准)

复制代码
for(deque<int>::iterator it = d.begin(); it != d.end(); it++)
{
    cout << *it << " ";
}

3. 范围 for 遍历(最简)

复制代码
for(int x : d)
{
    cout << x << " ";
}

五、完整示例代码

复制代码
#include <iostream>
#include <deque>
using namespace std;

int main()
{
    deque<int> d;

    // 头尾插入
    d.push_back(1);
    d.push_back(2);
    d.push_front(100);
    d.push_front(200);

    cout << "遍历所有元素:";
    for(int val : d)
    {
        cout << val << " ";
    }
    cout << endl;

    // 删除头尾
    d.pop_front();
    d.pop_back();

    cout << "删除后:";
    for(int val : d)
    {
        cout << val << " ";
    }

    return 0;
}

输出:

复制代码
遍历所有元素:200 100 1 2
删除后:100 1

六、vector vs deque 核心对比

表格

特性 vector deque
底层结构 连续内存数组 分段块内存
尾部增删 极快
头部增删 很慢(整体后移) 极快
随机访问 支持 \[\] 支持 \[\]
中间插入
适用场景 纯尾部操作、随机访问多 需要频繁头尾增删

七、新手易错点

  1. 误以为 deque 中间插入很快(依然很慢)
  2. 混用 push_front / pop_front 忘记是 deque 专属,vector 没有
  3. 迭代器遍历中频繁增删,导致迭代器失效
  4. 分不清什么时候选 vector、什么时候选 deque

八、今日总结

  1. deque 是双端队列,头尾都能高效增删
  2. 支持下标随机访问,用法和 vector 很像
  3. 独有接口:push_front / pop_front
  4. 头尾操作多选 deque,只在尾部操作用 vector
  5. 同样支持迭代器、范围 for,遍历写法通用
相关推荐
剩下了什么12 小时前
float32 与 float64 精度陷阱:如何在 Go 中避免错误使用
开发语言·后端·golang
指尖时光.12 小时前
Three.js 超全入门综合案例
开发语言·javascript·ecmascript
暴力求解12 小时前
Linux网络---传输层协议TCP(二)
linux·服务器·开发语言·网络·tcp/ip
石头猫灯12 小时前
WordPress wp2shell 漏洞链完整拆解流程
网络·数据结构·安全·web安全
吴声子夜歌12 小时前
Java面试题——基础(一)
java·开发语言
别动我齐刘海13 小时前
机器人运动控制学习2——基础进阶
c++·人工智能·神经网络·学习·目标检测·机器学习·机器人
小庞在加油13 小时前
WinDbg实战:QT/跨平台项目死锁与无响应问题排查指南
开发语言·qt·windbg·工具
Vae_Mars13 小时前
C#中的delegate委托
开发语言·c#
傻啦嘿哟13 小时前
英雄联盟皮肤爬虫:爬取全皮肤价格与特效,做比价工具
java·c++·爬虫
一直走下去-明14 小时前
简单的http抓包解包完整代码
开发语言·python