C++——stack和queue

news2024/9/19 11:16:32

作者:几冬雪来

时间:2023年10月5日

内容:C++——stack和queue内容讲解

目录

前言: 

什么是stack和queue: 

适配器模式:

stack:

queue: 

deque: 

相比vector和list: 

对vector:

​编辑

对list: 

使用deque: 

结尾: 


前言: 

前几篇博客我们讲解了C++的list还有list的迭代器的实现,那么今天我们将进入新的知识板块——栈和队列(stack和queue)。 

什么是stack和queue: 

学习stack和queue之前我们要先对二者有个大致的了解。

那么什么是stack呢?stack在这里可以被我们称为容器适配器,适配器的作用就是将现有的东西进行转换

同样的queue也是一种容器的适配器。 

适配器本质上就是一种附用。 

并且作为容器适配器的stack和queue就不存在迭代器了,因为stack和queue要先进先出和后进先出的原因,不支持随意的遍历。 

适配器模式:

回顾完了stack和queue之后,既然在介绍的时候有说到它们被称为容器适配器,适配器就是对已有的东西进行适配装换

那么接下来就来讲解什么是适配器模式

stack:

 

在讲解栈的时候,我们曾经说过有两种书写栈的方法,一种是数组栈,另外一种则是链式栈

而在C语言时期,因为没有过硬的能力和技术的支撑,那个时候我们只是学习了数组栈的知识,但是今天我们将在这里学习一个新的方法,数组栈和链式栈的切换

因为学习过模板的原因,在转换的时候我们可以增加模板参数

在后来书写的时候,一个传的是vector,另一个传的是list。这样就可以完成数组栈和链式栈之间的一个交换。 

这里还有一种写法。

在模板参数这里,将后一个模板参数加上一个缺省参数。这样就会使得在下面代码书写的时候,在写模板时,如果只有一个模板参数,那么这里就默认传的是vector

相反如果是两个模板参数的话,那就是传的list。 

queue: 

讲解完了栈之后,接下来我们来讲解队列的适配器。

因为stack和queue都是适配器,区别是一个先入先出,一个后入先出,因此在底层基础的构建上,栈和队列可以说是相同的

但是queue并不能和vector完全适配,vector接口处并没有提供头删

但是,不能完全适配并不是指在queue中就不能使用vector,二者是可以进行强制适配的

就如上图所写的代码,vector并不提供头删的接口。想要强制适配的话,这个地方就要提供二者都能使用的接口,也就是erase来进行头删操作

同样的在模板处也可以用list来作为缺省参数

deque: 

接下来介绍的deque也是我们的容器。在官方的代码中deque就是他们所使用的默认容器,那么deque到底是什么? 

首先deque在这个地方被称为——双端队列。 

双端队列顾名思义两个端都可以使用,通俗易懂来说deque就类似stack和queue的一种结合体

但是为什么这么好用和实用的容器我们现在才讲解它,那肯定是有原因的,因为对比stack和queue,deque有些地方存在问题我们才没有第一时间讲解它

 

就如上图一样,deque是stack和queue的结合体,因此它也同时拥有stack和queue的接口。但是deque却不能取代vector和list

deque确实拥有许多接口,但是在平时写代码的时候我们却是很少使用这个容器,这是因为deque的效率要低于vector和list

 

在C语言时期就讲解过数组栈(vector)和链式栈(list)的底层实现,一个是一整个数组,另外一个则是通过指针对数据进行串联

既然deque是二者的结合,那么它的底层又是什么样的?

这就是deque的底层,因为是vector和list的结合所以deque也有它们的特征所在

这个地方我们增加了一个中控指针数组来存储,在list中每个数据只是占据了一个空间的大小,在deque中每个指针指向的不是一个数据大小的空间,而是一个buff数组

如果中控指针数组(buff)满了的话,只需要对其进行扩容操作,而扩容的代价也是十分的小,只需要拷贝指针即可。 

同时要注意的是deque的头插操作,尾插的话照旧,头插就有些区别了。deque是从后往前插入数据。 

相比vector和list: 

上面我们将deque的底层书写了出来,deque有它的优势所在,同时也会有存在缺陷的地方。那么与vector和list相对比,deque有什么优点和缺点

对vector:
对list: 

使用deque: 

在上面的比较结束后,我们可以看出来高频率的头插头删和尾插尾删很适合deque的使用

因此deque用来适配stack和queue的默认容器是十分合适的。 

但是高频的中间插入和高频的随机访问deque的使用不太行。 

同时deque在现实中使用十分的少,这是因为它的适配的东西不多,同时底层代码也是十分的复杂。直到目前deque使用能好于list和vector的地方就是stack和queue的默认容器

平时在正常书写代码的时候就使用vector和list。 

结尾: 

这篇博客可以说是我们C++学习的时候对C语言时期的stack和queue进行的一个拓展和延伸,同时也借由stack和queue介绍了一个新的容器deque,以及它的使用之处和对比vector和list的优劣,最后希望这篇博客能带来帮助。

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

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

相关文章

两文学会scala (上)|保姆级别教程(超详细)

目录 一 Scala入门 1.1 概述 1.1.1 为什么学习Scala 1.1.2 Scala发展历史 1.1.3 Scala和Java关系 1.1.4 Scala语言特点 1.2 scala 运行环境准备 二 变量和数据类型 2.1 注释 1)基本语法 2)案例实操 3)代码规范 2.2 变量和常量&a…

基于Java的自习室预订座位管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

用稳定扩散生成4K PBR纹理【SDXL】

我正在继续去年开始使用 Three.JS 构建 3D 场景和草图的工作。 当时,DALL-E 和 Stable Diffusion 等 AI 图像生成器刚刚真正起飞。 我成功地在本地运行稳定扩散,并使用它为我正在构建的 3D 世界中的地形、建筑物和其他环境生成纹理。 当时我使用的是稳…

sd卡数据异常丢失怎么办?别慌,有这五种应对方法

随着SD卡在我们的生活中越来越广泛地使用,我们很可能会遇到SD卡数据异常丢失的情况。这种情况可能会给我们带来困扰和不便,因为丢失的数据可能包含了我们珍贵的照片、音乐、视频和文件等重要信息。幸运的是,在大多数情况下,我们仍…

多目标跟踪框架boxmot介绍

引言 boxmot由mikel brostrom开发,用于目标检测,分割和姿态估计模型的SOTA(state of art)跟踪模块,现已加入python第三方库 PYPI,可用pip包管理器进行安装。 boxmot所支持的跟踪器采用外观特征识别方法&am…

一文了解VR全景在城市园区和电子楼书的应用

引言: 虚拟现实(VR)技术在日常生活中越发普及,已经成为众多行业的宣传工具,房地产行业近些年来热度较低,VR全景为房地产展示带来了新方式,为购房者提供更真实、更直观的体验。 一.…

练[MRCTF2020]Ez_bypass

[MRCTF2020]Ez_bypass 文章目录 [MRCTF2020]Ez_bypass掌握知识解题思路关键paylaod 掌握知识 ​ 代码审计,md5函数绕过,is_numeric函数绕过,弱等于的字符串和数字类型绕过 解题思路 打开题目链接,发现是代码审计题目&#xff0…

基于猫群优化的BP神经网络(分类应用) - 附代码

基于猫群优化的BP神经网络(分类应用) - 附代码 文章目录 基于猫群优化的BP神经网络(分类应用) - 附代码1.鸢尾花iris数据介绍2.数据集整理3.猫群优化BP神经网络3.1 BP神经网络参数设置3.2 猫群算法应用 4.测试结果:5.M…

buuctf-[BSidesCF 2020]Had a bad day 文件包含

打开环境 就两个按钮,随便按按 url变了 还有 像文件包含,使用php伪协议读取一下,但是发现报错,而且有两个.php,可能是自己会加上php后缀 所以把后缀去掉 /index.php?categoryphp://filter/convert.base64-encode/resourcei…

从0开始深入理解并发、线程与等待通知机制(中)

一,深入学习 Java 的线程 线程的状态/生命周期 Java 中线程的状态分为 6 种: 1. 初始(NEW):新创建了一个线程对象,但还没有调用 start()方法。 2. 运行(RUNNABLE):Java 线程中将就绪(ready)和…

Endnote修改参考文献(References)的期刊全称为缩写

一、准备(下载)所需要的期刊缩写列表 (Term Lists) 我已经下载并上传了一份Trem Lists 链接: 在不列颠哥伦比亚大学图书馆网站导出所有期刊名和缩写,大概1W的期刊名字,期刊名字和缩写截至2021.12.03 哥伦…

【抢先体验】开通使用 ChatGPT 语音版功能保姆级教程

大家好,我是苍何,一个土木转码的非典型程序员,也是一名技术管理者,同时也是 AI 应用的探索者。今天在视频号上看到和 ChatGPT 语音对话的视频,其声音的真实感太让人震撼了,于是也想去抢先体验一下 ChatGPT …

学习记忆——宫殿篇——记忆宫殿——记忆桩——卧室——莫兰勋爵在地铁走失的案子

《神探夏洛克》第三季第一集中提到“思维殿堂”,其实指的就是记忆宫殿。讲述了一个名叫莫兰勋爵在地铁走失的案子,这里简单给大家罗列以下破案信息: 订阅报纸的男人、伦敦养狗的女人、穿着黑色运动的非裔女人、松木、云杉、雪松、新樟脑球、碳…

js——深拷贝和浅拷贝

深拷贝和浅拷贝是只针对Object和Array这样的引用数据类型的。对于基本数据类型,例如字符串、数字、布尔值等,由于它们是按值传递的,所以不存在深拷贝和浅拷贝的问题。 深拷贝 将对象从内存中完整拷贝出来,从堆内存中开辟一个新的…

mac电脑任务管理器 Things3 for Mac中文

Things 3是一款效率软件,可以帮助用户规划一天行程、管理项目,并使使用者按部就班地朝目标迈进。以下是Things 3的主要特点和功能: 待办事项:以“待办事项”为基本组成部分,每一则待办事项都是迈向大成就的一小步。用…

【每日一题】买卖股票的最佳时机含冷冻期

文章目录 Tag题目来源题目解读解题思路方法一:动态规划空间优化 写在最后 Tag 【动态规划】【数组】【2023-10-05】 题目来源 309. 买卖股票的最佳时机含冷冻期 题目解读 这是股票系列问题的第五篇了,要求求出买卖股票的最佳时期以获得最大的利润&…

基于spirngboot人事考勤管理信息系统

一:功能介绍 本系统前端采用vue框架以及Elemnt-UI,后端采用springboot、mysql、redis、mybatis等技术栈。 主要功能有登录、员工考勤、数据统计、薪资管理、权限管理、打卡管理、考勤审核、请假审批、薪资发放、报表统计、文件上传、文件下载、考勤设置、请假设置。…

Spring Boot注册Web组件

文章目录 什么是Web组件?注册Servlet注册Filter注册Listener总结 🎉欢迎来到架构设计专栏~Spring Boot注册Web组件 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒🍹✨博客主页:IT陈寒的博客🎈该系列文章专栏:架构设计&a…

安装matplotlib__pygame,以pycharm调入模块

安装pip 安装matplotlib 安装完毕,终端输入pip list检查 导入模块出现bug,发现不是matplotlib包的问题,pycharm版本貌似不兼容,用python编辑器可正常绘图,pygame也可正常导入。 ​​​​​​​ pycharm版本问题解决 终…