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,遍历写法通用
相关推荐
阿里嘎多学长7 分钟前
2026-07-10 GitHub 热点项目精选
开发语言·程序员·github·代码托管
CHHH_HHH34 分钟前
【C++11】深入解析C++可变参数模板
开发语言·c++·算法·stl·c++11
十五年专注C++开发1 小时前
fatal error C1189: #error: WinSock.h has already been included 的解决方案
c++·socket·boost
jimy13 小时前
C语言模拟对象、方法:“函数指针+结构体“复用函数指针指向的函数体
c语言·开发语言
天外天-亮3 小时前
HBuilder X 使用 uview-plus 方式
开发语言·javascript·hbuilder x·uview-plus
木木子223 小时前
[特殊字符] 音乐播放器——状态驱动的多媒体控制
android·开发语言·华为·php·harmonyos
旖-旎4 小时前
《LeetCode 53 最大子数组和 || LeetCode 918 环形子数组的最大和》
c++·算法·leetcode·动态规划
QN1幻化引擎4 小时前
给 AI 做一次「意识体检」——基于 QN1 幻化引擎的灵鉴意识识别框架与 DalinX V5 实测
大数据·数据结构·人工智能·算法·架构
六个九十度4 小时前
用python脚本访问被网关隔离的嵌入式设备
开发语言·python
拂拉氏4 小时前
【知识讲解】 AVL树从基本成员的介绍到核心接口的实现(插入、判断、删除等等)
数据结构·算法·avl树