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 的区别、迭代器类型、迭代器失效规则。
相关推荐
xian_wwq1 小时前
【学习笔记】RAG 只是 Context Engineering 的一小块-5/16
笔记·学习·rag
abbgogo1 小时前
OSPF动态路由协议
开发语言·php
我不会插花弄玉1 小时前
15.map,set下:AVL树,红黑树和map,set的封装【由浅入深-C++】
c++·stl
en.en..1 小时前
C 语言嵌入式事件驱动状态机完整教程(枚举配套)
c语言·开发语言
hold?fish:palm1 小时前
20 旋转图像
c++·算法·leetcode
Tim_102 小时前
【C++】024、new[]与delete[]配对使用
java·开发语言
iCxhust2 小时前
8088单板机VScode集成开发环境使用方法
ide·笔记·vscode·编辑器·微机原理·8088单板机
Yyyyyy~2 小时前
[C语言]break和continue作业
c语言·开发语言
小黑技术栈2 小时前
Java前端基础到入门——16day
java·开发语言·前端
文人sec2 小时前
MySQL事务与索引做了什么?
android·笔记·mysql