C++ 笔记 ——STL deque

deque 是 STL 中双端队列 容器,全称double-ended queue,结合了vectorlist的核心优势:支持随机访问头尾两端高效增删元素,是开发中处理双端操作场景的首选容器。本文从基础认知、初始化、核心 API、底层原理、迭代器、容器对比、核心考点七个维度整理,适配学习与面试。


一、deque 基础认知

  1. 本质 :分段连续内存实现的双端队列,STL 序列式容器。

  2. 核心特点

    • 支持头部、尾部O (1) 时间复杂度增删元素(vector 不支持头部高效操作);
    • 支持随机访问[]at(),和 vector 一致,list 不支持);
    • 内存管理:分段连续存储,无整体扩容开销;
    • 中间插入 / 删除效率低,需要移动元素。
  3. 头文件

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

    二、deque 的定义与初始化

    用法与vector几乎完全一致,学习成本极低:

    cpp 复制代码
    #include <iostream>
    #include <deque>
    using namespace std;
    
    int main() {
        // 1. 空容器
        deque<int> d1;
    
        // 2. 指定大小,默认值0
        deque<int> d2(5);
    
        // 3. 指定大小+初始值
        deque<int> d3(5, 10);
    
        // 4. 列表初始化
        deque<int> d4 = {1,2,3,4};
    
        // 5. 拷贝初始化
        deque<int> d5(d4);
    
        return 0;
    }

    三、deque 核心常用 API

    1. 元素访问(与 vector 完全一致)

    表格

    方法 作用
    d[i] 随机访问,不检查越界
    d.at(i) 随机访问,越界抛异常
    d.front() 获取首元素
    d.back() 获取尾元素

    2. 增删元素(双端操作,核心优势)

    表格

    方法 作用 时间复杂度
    push_back(val) 尾部插入 O(1)
    emplace_back(val) 尾部原位构造 O(1)
    pop_back() 删除尾部元素 O(1)
    push_front(val) 头部插入 O(1)
    emplace_front(val) 头部原位构造 O(1)
    pop_front() 删除头部元素 O(1)
    insert(pos, val) 指定位置插入 O(n)
    erase(pos) 删除指定位置元素 O(n)
    clear() 清空所有元素 O(n)

    3. 容量操作

    表格

    方法 作用
    size() 获取元素个数
    empty() 判断是否为空
    resize(n) 调整元素数量
    reserve() deque 无此方法(无整体扩容)

    四、deque 底层原理(面试核心)

    deque 不是一整块连续内存,这是和 vector 最大的区别:

  4. 底层由多个独立的连续内存缓冲区(分段) 组成;

  5. 维护一个中控器(map 数组),记录所有分段缓冲区的地址;

  6. 头尾插入元素时,直接开辟新的分段缓冲区,无需拷贝旧数据

  7. 逻辑上连续,物理上分段连续。

✅ 优势:无 vector 的扩容开销,头尾增删极致高效;❌ 劣势:中间插入 / 删除需要移动元素,效率低。


五、deque 的迭代器

结合你之前学习的STL 迭代器知识点,deque 迭代器是重点:

  1. 迭代器类型随机访问迭代器 (和 vector 一致,支持++、--、+n、[]);
  2. 底层实现:封装了中控器 + 分段缓冲区指针(比 vector 迭代器复杂,不是原生指针);
  3. 遍历用法:与 vector、list 通用,支持迭代器、范围 for、下标遍历;
  4. 代码示例

六、deque /vector/list 核心对比(面试必背)

表格

特性 vector deque list
内存结构 整块连续 分段连续 非连续(双向链表)
随机访问 支持 支持 不支持
头部增删 O (n),低效 O (1),高效 O (1),高效
尾部增删 O(1) O(1) O(1)
中间增删 O(n) O(n) O(1)
迭代器类型 随机访问 随机访问 双向
迭代器失效 扩容 / 插入 / 删除均失效 仅中间操作失效 仅删除位置失效

七、总结(核心考点浓缩)

  1. deque 是分段连续内存 的双端队列,支持随机访问,头尾增删效率为 O (1);
  2. 核心 API:push_front/pop_front是区别于 vector 的关键方法;
  3. 迭代器:随机访问迭代器,底层封装中控器与分段指针,用法与 vector 一致;
  4. 底层:无整体扩容,多段内存 + 中控器管理,兼顾访问效率与双端操作;
  5. 迭代器失效:头尾增删不失效,中间插入 / 删除会导致迭代器失效;
  6. 适用场景:需要头尾频繁操作随机访问,替代 vector + 头部操作的场景;
  7. 面试高频:deque 底层结构、与 vector/list 的区别、迭代器类型、迭代器失效规则。
相关推荐
小小测试开发2 分钟前
安装 Python 3.10+
开发语言·人工智能·python
好评1241 小时前
【C++】智能指针全解
c++·智能指针
AAA大运重卡何师傅(专跑国道)2 小时前
【无标题】
开发语言·c#
是阿建吖!2 小时前
【Linux】信号
android·linux·c语言·c++
城北徐宫2 小时前
Linux信号深度解剖:5种产生、3张表、4次切换
linux·c++·学习
liulilittle2 小时前
论 Linux 内核态全局稳态带宽的卡尔曼估计与工程实现
linux·服务器·网络·c++·计算机网络·tcp·通信
XBodhi.2 小时前
Visual Studio C++ 语法错误: 缺少“;”(在“return”的前面)
开发语言·c++·visual studio
LSssT.3 小时前
【01】Python 机器学习
开发语言·python
三品吉他手会点灯3 小时前
C语言学习笔记 - 43.运算符与表达式 - 运算符1 - 运算符的分类和简单介绍
c语言·笔记·学习·算法
疯狂打码的少年3 小时前
中断处理过程与中断优先级
笔记