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 的区别、迭代器类型、迭代器失效规则。
相关推荐
MarkHD1 小时前
调度、监控与部署:Python自动化任务全栈实践
开发语言·python·自动化
他是龙5511 小时前
DVWA SQL 注入全级别通关笔记(Low / Medium / High / Impossible)
数据库·笔记·sql
同勉共进1 小时前
并发编程系列(二)—— store, load 与 RMW
c++·arm·并发编程·x86·store·load·rmw
山甫aa1 小时前
多叉树定义与遍历-----从零开始的数据结构
开发语言·c++·二叉树·多叉树
永远睡不够的入1 小时前
C++11新特性(2):深入 C++ 参数传递黑盒:从引用折叠到完美转发,再到可变参数模板
开发语言·c++
无限进步_2 小时前
【C++】寻找数组中出现次数超过一半的数字:三种解法深度剖析
开发语言·c++·git·算法·leetcode·github·visual studio
深邃-2 小时前
【Web安全】-Kali,Linux配置(1):Kali网络配置,LinuxEnvConfig配置脚本,APT源的讲解,Kali设置中文
linux·运维·开发语言·网络·安全·web安全·网络安全
Hello World . .2 小时前
Linux驱动编程:内核同步的艺术-从互斥到底半部
linux·开发语言·数据库
江山与紫云2 小时前
告别重复造轮子:Codex写脚本
开发语言·python
覆东流2 小时前
第8天:python列表基础
开发语言·python