C++ 浅谈之 STL Deque

news2025/5/30 14:37:55

C++ 浅谈之 STL Deque

HELLO,各位博友好,我是阿呆 🙈🙈🙈

这里是 C++ 浅谈系列,收录在专栏 C++ 语言中 😜😜😜

本系列阿呆将记录一些 C++ 语言重要的语法特性 🏃🏃🏃

OK,兄弟们,废话不多直接开冲 🌞🌞🌞


一 🏠 概述

简单介绍

Deque 双端队列,在头尾对元素进行删除和插入快,中间插入或删除效率低,支持元素随机访问。它是动态分段连续空间组合而成,无 capacity 概念,可即时增加新空间(不会像 vector 因旧空间不足而重新申请)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JUQ3IwMY-1675954090283)(E:\2022年MD文档\2023 年 MD文档\二月\浅谈系列\C++ 浅谈之 STL Deque.assets\1675951423972.png)]

和 Vector 维护连续线性空间不同,Deque 维护多段连续空间,各段间不一定连续,Deque 用数组(名为 map)存储着各连续空间首地址 👦👦👦

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fJg1VBNk-1675954090285)(E:\2022年MD文档\2023 年 MD文档\二月\浅谈系列\C++ 浅谈之 STL Deque.assets\1675951752739.png)]


迭代器

分段存储提高了两端添加,删除的效率,也使容器迭代器实现更复杂,有如下 2 个问题

① 迭代器遍历时,须确认各连续空间在 map 数组中的位置 👨‍🚀👨‍🚀👨‍🚀

② 迭代器在某个连续空间时,须知道是否处于空间边缘(一旦前进,需要跳到下一个连续空间)

//迭代器内部实现如上,包含 4 个指针
template<class T,...>
struct __deque_iterator{
    ...
    T* cur; //指向当前正在遍历的元素
    T* first; //指向当前连续空间的首地址
    T* last; //指向当前连续空间的末尾地址
    map_pointer node; //T** 二级指针, 指向 map 数组中存储的指向当前连续空间的指针
}

借助这四个指针和运算符重载,使迭代器可以在分段连续空间遍历 🎅🎅🎅

//当迭代器处于当前连续空间边缘的位置时,如果继续遍历,就需要跳跃到其它的连续空间中,该函数可用来实现此功能
void set_node(map_pointer new_node){
    node = new_node;//记录新的连续空间在 map 数组中的位置
    first = *new_node; //更新 first 指针
    //更新 last 指针,difference_type(buffer_size())表示每段连续空间的长度
    last = first + difference_type(buffer_size());
}

//重载 * 运算符
reference operator*() const{return *cur;}
pointer operator->() const{return &(operator *());}

//重载前置 ++ 运算符
self & operator++(){
    ++cur;
    //处理 cur 处于连续空间边缘的特殊情况
    if(cur == last){
        //调用该函数,将迭代器跳跃到下一个连续空间中
        set_node(node+1);
        //对 cur 重新赋值
        cur = first;
    }
    return *this;
}

//重置前置 -- 运算符
self& operator--(){
    //如果 cur 位于连续空间边缘,则先将迭代器跳跃到前一个连续空间中
    if(cur == first){
        set_node(node-1);
        cur == last;
    }
    --cur;
    return *this;
}

二 🏠 核心

底层实现

STL Deque 有如下的定义代码 👇👇👇

//_Alloc为内存分配器
template<class _Ty,
    class _Alloc = allocator<_Ty>>
class deque{
    ...
protected:
    iterator start; // map 数组中首个连续空间的信息
    iterator finish; //map 数组中最后一个连续空间的信息
    map_pointer map;
...
}

内部空间布局,如下图所示 🐳🐳🐳

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gbKUALTy-1675954090286)(E:\2022年MD文档\2023 年 MD文档\二月\浅谈系列\C++ 浅谈之 STL Deque.assets\1675951491835.png)]

三 🏠 结语

身处于这个浮躁的社会,却有耐心看到这里,你一定是个很厉害的人吧 👍👍👍

各位博友觉得文章有帮助的话,别忘了点赞 + 关注哦,你们的鼓励就是我最大的动力

博主还会不断更新更优质的内容,加油吧!技术人! 💪💪💪

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/334784.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

舆情监测方案怎么写,TOOM舆情监测系统解决方案

舆情监测是通过网络和媒体来收集、分析、评估和报告关于某一特定话题或组织的舆论动态的过程。舆情监测方案通常包括数据收集、数据分析、报告生成等步骤&#xff0c;以帮助组织了解公众对其的看法和声音&#xff0c;并以此作出相应的决策和行动&#xff0c;舆情监测方案怎么写…

车道线检测-Eigenlanes 论文学习笔记

论文&#xff1a;《Eigenlanes: Data-Driven Lane Descriptors for Structurally Diverse Lanes》 代码&#xff1a;https://github.com/dongkwonjin/Eigenlanes 核心&#xff1a;在 Eigenlane Space 中检测车道线 创新点 Eigenlane&#xff1a;数据驱动的车道描述符&#xff…

Python中__init__.py文件深入理解

Python中文件__init__.py深入理解1. 简介1.1 模块&#xff08;Module&#xff09;和包&#xff08;Package&#xff09;的概念1.2 __init__.py文件简介2. __init__.py内容写法2.1 __init__.py文件内容2.2 __init__.py内容解释1. 简介 1.1 模块&#xff08;Module&#xff09;和…

这是从零在独自开开发,将是副业赚钱最好的平台!

文章目录最重要的事情放前面1.前言2.简单介绍一下3.【独自开】介绍3.1 分层标准化平台架构3.2 集成第三方数字接口3.3 支持各个行业的系统定制开发4.如何在【独自开】赚钱获取收益?4.1 如何称为【独自开】开发者?最重要的事情放前面 通过平台的审核也可以得到相应的奖金&…

信息系统建设和服务能力等级证书(CS)

2019年11月26日&#xff0c;中国电子信息行业联合会发布了《信息系统建设和服务 能力评估体系 能力要求》&#xff08;简称《能力要求》&#xff09;。《能力要求》是我国信息系统建设和服务能力领域的首个团体标准&#xff0c;旨在通过该标准的实施提升信息系统建设和服务行业…

Linux学习之冯诺依曼体系结构

目录冯诺伊曼结构体系基本概念冯诺依曼结构分为五个部分组成冯诺依曼结构体系的各部分的读写特点&#xff1a;从软件数据上认识冯诺依曼结构体系冯诺伊曼结构体系 基本概念 数学家冯诺依曼提出了计算机制造的三个基本原则&#xff0c;即采用二进制逻辑、程序存储执行以及计算机…

JVM相关面试题

文章目录说一下 JVM 的主要组成部分及其作用&#xff1f;说一下 JVM 运行时数据区 &#xff1f;JVM中哪些是线程共享区 &#xff1f;说一下堆栈的区别&#xff1f;队列和栈是什么&#xff1f;有什么区别&#xff1f;简述Java类加载机制?说一下类装载的执行过程&#xff1f;什么…

类的 6 个默认成员函数

文章目录一、构造函数1. 构造函数的定义2. 编译器生成的构造函数3. 默认构造函数4. 初始化列表5. 内置成员变量指定缺省值(C11)二、析构函数1. 析构函数的定义2. 编译器生成的析构函数3. 自己写的析构函数的执行方式三、拷贝构造函数1. C语言值传递和返回值时存在 bug2. 拷贝构…

2023上半年软考中级报名-系统集成项目管理工程师

系统集成项目管理工程师是全国计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试&#xff08;简称软考&#xff09;项目之一&#xff0c;是由国家人力资源和社会保障部、工业和信息化部共同组织的国家级考试&#xff0c;既属于国家职业资格考试&#xff0c;又是职…

【Hello Linux】 Linux基础命令(持续更新中)

作者&#xff1a;小萌新 专栏&#xff1a;Linux 作者简介&#xff1a;大二学生 希望能和大家一起进步&#xff01; 本篇博客简介&#xff1a;介绍Linux的基础命令 Linux基础命令ls指令lsls -als -dls -ils -sls -lls -nls -Fls -rls -tls -Rls -1总结思维导图pwd指令whoami指令…

已解决:pywintypes.com_error: (-2147221005, ‘无效的类字符串‘, None, None)

今天接到一个需求&#xff0c;就是读取doc文件&#xff0c; 注意是doc! doc! doc&#xff0c; 不是docx! 不是docx! 不是docx! 以下的博客都是挂羊头&#xff0c;卖狗肉 但是好多博客都是读取docx&#xff0c;以次来博取流量与眼球&#xff0c;还有好多我都用不了&#xff0…

做产品时有哪些常见的错误认知?

作为产品新人最容易遗漏的就是一些小的细节&#xff0c;有时候可能脑子里想过&#xff0c;可因为事情繁冗又遗漏了某些环节&#xff0c;导致项目不顺利。 产品经理就像是全托幼儿园的唯一一个老师&#xff0c;想要做的好就要管的多且全面&#xff0c;将自己的位置放的低一点多…

centos7环境安装单机版MinIo后台自启动

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录MinIo简介一、搭建MinIo1. Linux服务器执行命令&#xff0c;查看当前系统2. 执行对应版本的minIo下载命令3. 下载完毕&#xff0c;执行启动服务命令4. minIo 启动成功…

08讲 | 基于STM32单片机NBIOT定位实战项目

前言 绘制基于 STM32 单片机的 NBIOT 实战开发板。 文章目录前言一、原理图1、绘制1&#xff09;电源供电a、USB 转 TTL 电路b、锂电池充电管理电路c、3.3V电压转换电路d、一键开关机电路2&#xff09;单片机最小系统3&#xff09;ADC电压转换电路4&#xff09;NBIOT 模组串口电…

Resin内存马逆袭之路

前言 故事还是要从很久很久以前说起&#xff0c;红蓝对抗越来越激烈&#xff0c;常见的免杀Webshell文件已经逃脱不了蓝队大佬的火眼金睛了&#xff0c;函数混淆的花里胡哨最后还是能被轻松分析&#xff0c;所以早在很多年前&#xff0c;就已经进入了内存马的时代&#xff0c;…

细讲一个 TCP 连接能发多少个 HTTP 请求(一)

一道经典的面试题是从 URL 在浏览器被被输入到页面展现的过程中发生了什么&#xff0c;大多数回答都是说请求响应之后 DOM 怎么被构建&#xff0c;被绘制出来。但是你有没有想过&#xff0c;收到的 HTML 如果包含几十个图片标签&#xff0c;这些图片是以什么方式、什么顺序、建…

Android主页面进程卡死黑屏怎么办?多线程机制来解决

问题描述 在做一个页面跳转小案例&#xff0c;在输入页输入要计算第几项斐波那契数列&#xff0c;然后跳转到另一个页面显示计算的结果&#xff0c;当输入的值很大时&#xff0c;跳转到另一个页面时&#xff0c;页面卡死黑屏。 页面卡死黑屏问题原因 计算斐波那契数列的常规方法…

Linux--fork

一、fork入门知识 fork&#xff08;&#xff09;函数通过系统调用创建一个与原来进程几乎完全相同的进程&#xff0c;也就是两个进程可以做完全相同的事&#xff0c;但如果初始参数或者传入的变量不同&#xff0c;两个进程也可以做不同的事。可以简单地说fork()的作用就是创建一…

如何在Python里使用ChatGPT及ChatGPT是什么?怎么注册?

废话不多说&#xff0c;直接开干! 需要库 pip install openaiimport openai# Set your API keyopenai.api_key "你的chatgpt的密钥key"# Use the GPT-3 modelcompletion openai.Completion.create(engine"text-davinci-002",prompt"Once upon …

纯CSS实现[喵咪小挂件]

效果预览 网页上&#xff1a; 小程序中&#xff1a; 在微信小程序中使用时&#xff0c;将div标签改成view即可。 小程序中封装 如下&#xff0c;在小程序中可封装成组件&#xff08;方便使用&#xff09; 1、先在components目录下新建一个目录存放该组件。 2、右键上一步…