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 的区别、迭代器类型、迭代器失效规则。
相关推荐
库玛西1 小时前
深入浅出传输层:UDP 与 TCP 协议全景指南
linux·服务器·网络·c++·笔记·tcp/ip·udp
Chester_19997 小时前
CSP202203C.计算资源调度器
开发语言·数据结构·c++·蓝桥杯
知产xiao_xin8 小时前
知识产权入门 —— 相关权(邻接权)
经验分享·笔记·知识产权
EXI-小洲8 小时前
Java 操作 Word:字符串替换、图片插入、动态生成表格与API接口下载
java·开发语言·spring boot·word
自小吃多8 小时前
DXF文件导入与PCB板框定义笔记
笔记·嵌入式硬件
会周易的程序员8 小时前
给 PLC 写一个字节码虚拟机:STVM 虚拟机架构设计
开发语言·c++·虚拟机·软plc·iec61131·stvm
机器视觉知识推荐、就业指导9 小时前
为什么老说“纯 Qt 没啥就业市场”?
开发语言·qt
telepan9 小时前
Qt 开发避坑与性能指南:如何优雅、安全地定义全局常量字符串?
开发语言·qt
小灰灰搞电子9 小时前
完全驾驭 Qt 与数据库:C++ ORM 框架 QxOrm 原理与实践指南
数据库·c++·qt
QT界面美化性能优化9 小时前
QT+AI:使用AI技术为QT应用程序赋能
c++·人工智能·qt·opencv·qt教程·qt6.3