C++ 笔记 ——STL deque

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


一、deque 基础认知

  1. 本质:分段连续内存实现的双端队列,STL 序列式容器。
  2. 核心特点
    • 支持头部、尾部O (1) 时间复杂度增删元素(vector 不支持头部高效操作);
    • 支持随机访问[]at(),和 vector 一致,list 不支持);
    • 内存管理:分段连续存储,无整体扩容开销;
    • 中间插入 / 删除效率低,需要移动元素。
  3. 头文件
    #include <deque>
    using namespace std;

    二、deque 的定义与初始化

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

    #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 核心对比(面试必背)

表格

特性vectordequelist
内存结构整块连续分段连续非连续(双向链表)
随机访问支持支持不支持
头部增删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 的区别、迭代器类型、迭代器失效规则。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南境十里·墨染春水

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值