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 的区别、迭代器类型、迭代器失效规则。
相关推荐
汉克老师38 分钟前
GESP2026年9月认证C++六级( 第三部分编程题(1、数组划分))精讲
c++·gesp·小学生·学c++编程
千里码aicood1 小时前
基于PLC与机器视觉的智能分拣控制系统设计
c++·自动化·plc
zjxtxdy1 小时前
SPI通信协议
笔记·单片机
漂流瓶jz1 小时前
UVA-1442 洞穴 题解答案代码 算法竞赛入门经典第二版
c++·算法·题解·aoapc·算法竞赛入门经典·uva
朽棘不雕1 小时前
进一步了解模板
c++
Bruce_Liuxiaowei2 小时前
Python 实例赋值遮蔽类属性:一个从不报错的静默陷阱
开发语言·python·语法糖
彧azz3 小时前
Linux 网络编程学习总结
linux·网络·笔记·学习·面试
aramae4 小时前
MySQL内置函数(7)
开发语言·笔记·后端·mysql·其他
bessyon4 小时前
信息透明度与决策效率:一个技术视角的分析
笔记
汉克老师4 小时前
CSP-J 2026 初赛试题解析(第一部分:选择题(8-15))精讲
c++·csp-j·小学生·学c++编程