C++STL-stackqueue的实现

news2024/11/26 15:37:18

文章目录

  • 1. deque的简单介绍
    • 1.1 deque的原理介绍
    • 1.2 deque的优缺点
    • 1.3 为什么选择deque作为底层默认容器
  • 2. stack的实现
  • 3. queue的实现

1. deque的简单介绍

在前面已经介绍过,stack和queue这两个容器适配器,是由deque这个容器封装的。现在我们就需要先学习deque这个新容器。

1.1 deque的原理介绍

在这里插入图片描述
deque(双端队列):是一种双开口的"连续"空间的数据结构双开口的含义是:可以在头尾两端进行插入和删除操作,且时间复杂度为O(1),与vector比较,头插效率高,不需要搬移元素;与list比较,空间利用率比较高
在这里插入图片描述
deque并不是真正连续的空间,而是由一段段连续的小空间拼接而成的,实际deque类似于一个动态的二维数组
其底层结构如下图所示:
在这里插入图片描述
双端队列底层是一段假象的连续空间,实际是分段连续的在这里我们假设每一段空间是10个,如果我们想在尾部插入就这样:
在这里插入图片描述
在头部插入是这样:
在这里插入图片描述
在头部和尾部都有一个指针指向。那么,在这里我们是如何管理这些空间的呢?
在这里插入图片描述
其实是由一个指针数组来控制,每次当一个buffer(存储数据的空间)满了的时,扩容时,就会在指针数组里添加一个地址。后面扩的就在指针数组的后面添加,前面扩的就在指针数组前面添加。
当指针数组满了的时候,指针数组继续扩容:
在这里插入图片描述
但扩容的代价很少。

为了维护其“整体连续”以及随机访问的假象,落在了deque的迭代器身上因此deque的迭代器设计就比较复杂,如下图所示:
在这里插入图片描述

1.2 deque的优缺点

优点:
与vector比较,deque的优势是:头部插入和删除时,不需要搬移元素,效率特别高,在扩容时,不会浪费太多的空间,也不需要搬移大量数据。
与list比较,支持随机访问,CPU高速缓存命中低

缺点:
1.中间插入删除效率不行
2.虽然支持随机访问,但是效率比vector还是有差距的
3.不适合遍历,因为在遍历时,deque的迭代器要频繁的去检测其是否移动到某段小空间的边界,导致效率低下

因此在实际中,需要线性结构时,大多数情况下优先考虑vector和list,deque的应用并不多,而目前能看到的一个应用就是,STL用其作为stack和queue的底层数据结构。

1.3 为什么选择deque作为底层默认容器

stack是一种后进先出的特殊线性数据结构,因此只要具有push_back()和pop_back()操作的线性结构,都可以作为stack的底层容器,比如vector和list都可以;queue是先进先出的特殊线性数据结构,只要具有push_back和pop_front操作的线性结构,都可以作为queue的底层容器,比如list。但是STL中对stack和queue默认选择deque作为其底层容器,主要是因为:
1. stack和queue不需要遍历(因此stack和queue没有迭代器),只需要在固定的一端或者两端进行操作。
2. 在stack中元素增长时,deque比vector的效率高(扩容时不需要搬移大量数据);queue中的元素增长时,deque不仅效率高,而且内存使用率高。

所以,如果遇到大量的头尾插入删除,偶尔随机访问时,我们可以使用deque。

2. stack的实现

首先,它是这个样子的:
在这里插入图片描述
它用这个类型来定义一个对象,然后通过这个对象完成栈的相关操作。
在这里插入图片描述

3. queue的实现

queue也是一样的:
在这里插入图片描述

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

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

相关文章

易观千帆 | 11月用户体验GX评测:银行APP用户体验稳定提升,从流量竞争逐渐转向用户体验竞争

易观:随着银行行业对用户体验的重视,手机银行APP用户体验稳定提升,竞争也从注重MAU的流量竞争逐渐转移为用户体验竞争。11月易观千帆用户体验GX评测显示,平安口袋银行、中国工商银行、招商银行仍是AAAAA级,在用户体验维…

对于搞钱我们是认真的

前言 大家好,我是xiezhr。一提到搞钱,想必大家都非常非常感兴趣,立马就精神抖擞了。说实话,在这疫情爆发这几年里,赚点钱真不容易。 不知道你是不是也跟我一样,一个人在夜深人静的时候就在想怎么才能通过自…

十三.动态内存管理

目录 一.为什么存在动态内存分配 二.动态内存函数的介绍 1.malloc函数 2.free函数 3.calloc函数 4.reallco函数 三.常见的动态内存错误 1.对NULL空指针的解引用操作 2.对动态开辟空间的越界访问 3.对非动态开辟的内存使用free释放 4.使用free释放一块动态开辟内存的一…

HTML实现除夕最美烟花,2023春节倒计时,新年不可没有烟花,最炫烟花代码分享

📋 前言 🖱 博客主页:在下马农的碎碎念✍ 本文由在下马农原创,首发于CSDN📆 首发时间:2023/01/17📅 最近更新时间:2023/01/17🤵 此马非凡马,房星本是星。向前…

Android入门第58天-真机调试

开篇 随着我们的Android开始慢慢往后面涉及到设备、网络、通讯内容的开发。我们开始要把真机调试提上日程来了。 比如说:我们用Android扫描barcode、二维码都需要使用到Android的摄像头。而在Android Studio的AVP(模拟器)里,它的摄…

【树莓派4B】搭建HomeAssistant服务端(二)(systemd配置开机自启动,cpolar内网穿透)

设置开机自启动 创建home-assistanthomeassistant.service服务: sudo nano /etc/systemd/system/home-assistanthomeassistant.service复制以下内容,定义服务,其中After定义先行服务,ExecStart执行启动脚本: [Unit]…

程序跑起来数据总是关闭及丢失?保存进文件里面美滋滋

文章目录前言文件是什么?程序文件数据文件文件名C语言中的文件打开和关闭文件指针文件的打开和关闭fopenfclose文件的顺序读写文件的随机读写fseekftellrewind文件读取结束的判定feof:我们之间可能有误会文件缓冲总结前言 我们或许都有这样的苦恼&#…

【手写 Vue2.x 源码】第二十八篇 - diff算法-问题分析与patch优化

一,前言 首先对 6 月更文内容做一下简单的回顾: Vue2.x 源码环境的搭建Vue2.x 初始化流程介绍对象的单层、深层劫持数组的单层、深层劫持数据代理的实现对象、数组数据变化的观测Vue 数据渲染流程介绍模板生成 AST 语法树AST 语法树生成 render 函数re…

【Java寒假打卡】Java基础-XML文件

【Java寒假打卡】Java基础-XML文件概述标签的规则xml的语法规则解析XMLXML解析的准备工作XML解析文件的代码实现概述 标签的规则 xml的语法规则 <?xml version"1.0" encoding"UTF-8" ?> <!--本xml文件用于描述多个学生信息--> <students&…

教程: nodejs 做微信公众号开发,回复 xml 消息

教程&#xff1a; nodejs 做微信公众号开发&#xff0c;回复 xml 消息 首先需要你的后台跟服务器已经可以建立连接&#xff0c;这个不再冗述看官方教程就好 接入指南 。此篇介绍的是如何获取用户发来的信息&#xff0c;并回复它。 一、接收 xml 信息内容 我用的是 nodejs 的…

Android应用模块化开发指南

Android应用模块化开发指南 包含多个Gradle模块的项目称为多模块项目。本文包含多模块应用项目的最佳实践和推荐模式。 代码规模变大带来的问题 可扩缩性、可读性和整体代码质量会随着时间的推移而降低&#xff0c;代码维护者未采取积极的措施来保持易于维护的结构。模块化是…

【营销】uplift建模方案-专利总结

之前准备写专利的时候浏览了一下其他公司的专利&#xff0c;对于one model&#xff0c;还是two model&#xff0c;基模型是什么做了简单总结。 浦发银行&#xff08;CN 112446541 A&#xff09;——one model&#xff08;标签转换&#xff09; 基模型&#xff1a;NN分类融合m…

经济学学习(宏观)

--------------------------------------- 第8篇&#xff1a;宏观经济学的数据 --------------------------------------- 23. 一国收入的衡量(GDP&#xff0c;通胀) gdp衡量总收入和总支出&#xff0c;总收入总支出 某一既定时期&#xff0c;一个国家内生产的所有最终商品…

【科研试剂】16-Heptadecynoic acid,93813-16-2,16-庚二酸

【中文名称】16-庚二酸【英文名称】 16-Heptadecynoic acid&#xff0c;16-Heptadecynoic COOH【结 构 式】【CAS】93813-16-2【分子式】C17H30O2【分子量】266.43【纯度标准】95%【包装规格】1g&#xff0c;5g&#xff0c;10g【是否接受定制】可进行定制&#xff0c;定制时间周…

Java日志系统介绍和slf4j的使用

目录1. 日志系统介绍2. slf4j的使用2.1 slf4j的入门2.2 slf4j绑定日志框架1. 日志系统介绍 日志门面位于应用程序和日志框架之间&#xff0c;日志门面提供一个抽象的能力&#xff0c;日志框架进行具体的日志实现。可以很方便的更换日志框架。类似JDBC驱动 日志门面有&#xf…

业务逻辑漏洞

1、容易忽略的低危漏洞以及延伸利用 一、容易忽略的低危漏洞以及延伸利用 在挖洞的过程当中&#xff0c;比如我们碰到信息泄露漏洞&#xff0c;但是我们不知道这个是信息泄露&#xff1b;或者说我们碰到一个xss&#xff0c;我们不会利用&#xff0c;只能弹个窗&#xff0c;比如…

AcWing 4510. 寻宝!大冒险!(暴力枚举)

题目如下&#xff1a; 输入样例1&#xff1a; 5 100 2 0 0 1 1 2 2 3 3 4 4 0 0 1 0 1 0 1 0 0输出样例1&#xff1a; 3样例 111 解释 绿化图上 (0,0)(0,0)(0,0)、(1,1)(1,1)(1,1) 和 (2,2)(2,2)(2,2) 三处均可能埋有宝藏。 输入样例2&#xff1a; 5 4 2 0 0 1 1 2 2 3 3 …

C++入门:命名空间

目录 一.前言 C关键字(C98)总览&#xff1a; 一.作用域 二.命名冲突 三.命名空间 命名空间定义&#xff1a; 命名空间的嵌套定义&#xff1a; 四.命名空间的使用 五.命名空间的本质 一.前言 C是从C语言延伸出来的编程语言&#xff0c;C兼容了C语言百分之九十九的语法…

Lr 12 ACR 15:蒙版

Adobe Camera Raw &#xff08;简称为 ACR&#xff09;与 Lightroom Classic&#xff08;简称为 Lr 或 LrC&#xff09;使用同一引擎&#xff0c;其中的蒙版 Mask功能变得日益强大。基于人工智能技术&#xff08;AI 驱动&#xff09;&#xff0c;可快速而精准地选择主体、天空、…

Redis - Redis 6.0 新特性之多线程模型

1. Redis6.0之前的版本真的是单线程么&#xff1f; 否&#xff01;Redis 在处理客户端的请求时&#xff0c;包括获取 (socket 读)、解析、执⾏、内容返回 (socket 写) 等都由⼀个顺序串⾏的主线程处理&#xff0c;这就是所谓的「单线程」。 在执行命令阶段&#xff1a;Redis是…