【c++】【STL】stack类、queue类、deque类详解及模拟

news2024/9/23 1:35:13

🪐🪐🪐欢迎来到程序员餐厅💫💫💫

         今日主菜:stack和queue,deque类

                 主厨:邪王真眼

            所属专栏:c++专栏

              主厨的主页:Chef‘s blog

这可是我和c++之间让人热血沸腾的组合技啊!


[本节目标]

  • 1.容器适配器

  • 2. stack的介绍和模拟

  • 3. queue的介绍和模拟

  • 4.deque的介绍

1. 容器适配器

适配器是一种设计模式 ( 设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结) 该种模式是将一个类的接口转换成客户希望的另外一个接口
虽然 stack queue 中也可以存放元素, 但在STL中并没有将其划分在容器的行列 ,而是将其称为 容器适配器 ,这是因为 stack 和队列只是对其他容器的接口进行了包装,

2. stack的介绍和模拟

2.1 stack的介绍

1. stack是一种容器适配器,专门用在具有后进先出(FILO)操作的环境中,其删除只能从容器的一端进行元素的插入与提取操作。

2. stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出。

3. stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器类应该支持以下操作:

  • empty:判空操作
  • back:获取尾部元素操作
  • push_back:尾部插入元素操作
  • pop_back:尾部删除元素操作

4. 标准容器vector、deque、list均符合这些需求,默认情况下,如果没有为stack指定特定的底层容器, 默认情况下使用deque

我们先用vector来模拟一下

2.2 成员变量

注意事项:

         我们用的是模板,第一个参数表示数据类型,第二个表示stack是对哪个容器的封装

template<class T, class container = vector<T >>
class stack
{
public:
	//函数
private:
	container _con;
};

2.3 构造函数:

这个不用写,因为自动生成的默认构造函数会去调用container对应的容器的默认构造,这里就是vectro的默认构造。

2.4empty

是否为空栈

bool empty()
{
	return _con.empty;
}

2.5size

栈中的元素个数

size_t size()
{
	return _con.size();
}

2.6top

获取栈顶元素,注意返回值是传引用

	const T& top()const
	{
		return _con.back();
	}
	 T& top()
	{
		return _con.back();
	}

2.7push

将某个元素入栈

void push(T& val)
{
	_con.push_back(val);
}

2.8pop

将栈顶弹出

	void pop()
	{
		_con.pop_back();
	}

三:queue的介绍和模拟

3.1 queue的介绍

1. 队列是一种容器适配器,专门用于在 FIFO(先进先出) 中操作,其中从容器一端插入元素,另一端提取元素。
2. 队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类, queue 提供一组特定的成员函数来访问其元素。元素从队尾入队列,从队头出队列。
3. 底层容器可以是标准容器类模板之一,也可以是其他专门设计的容器类。该底层容器应至少支持以下操作:
  • empty:检测队列是否为空
  • size:返回队列中有效元素的个数
  • front:返回队头元素的引用
  • back:返回队尾元素的引用
  • push_back:在队列尾部入队列
  • pop_front:在队列头部出队列
4. 标准容器类 deque list 满足了这些要求。默认情况下,如果没有为 queue 实例化指定容器类,则使用标准容器deque

 

我们先用vector来模拟一下

 

 3.2成员变量

template<class T, class container = vector<T>>
class queue
{
public:
	// 函数
private:
	container _con
};

3.3 构造函数:

这个不用写,因为自动生成的默认构造函数会去调用container对应的容器的默认构造,这里就是vectro的默认构造。

3.4empty

bool empty()
{
	return _con.empty();
}

3.5size

size_t size()
{
	return _con.size();
}

3.6front

const T& front()const
{
	return _con.front();
}
 T& front()
{
	return _con.front();
}

3.7back

两个重载就不用我多说了吧

const T& back()const
{
	return _con.back();
}
 T& back()
{
	return _con.back();
}

3.8push

void push(T& val)
{
	_con.push_back(val);
}

3.9pop

void pop()
{
	_con.pop_front();
}

四:deque的介绍

4.1 deque的原理介绍

deque(双端队列) :是一种双开口的 " 连续 " 空间的数据结构 ,双开口的含义是:可以在头尾两端进行插入和删除操作,且时间复杂度为O(1) vector比较,头插效率高,不需要搬移元素;与list 比较,空间利用率比较高

4.2 deque的底层结构

deque 并不是真正连续的空间,而是由一段段连续的小空间拼接而成的,实际 deque 类似于一个动态的二维 数组 ,其底层结构如下图所示:
一开始在中间开辟空间,随后根据需求向两边进行扩容

4.3deque的迭代器

双端队列底层是一段假象的连续空间,实际是分段连续的,为了维护其 整体连续 以及随机访问的假象,落 在了 deque 的迭代器身上, 因此 deque 的迭代器设计就比较复杂,如下图所示:
deque 是如何借助其迭代器维护其假想连续的结构呢?

4.4deque的缺陷与优势

优势:

  • vector比较deque的优势是:头部插入和删除时,不需要搬移元素,效率特别高,而且在扩容时,也不需要搬移大量的元素,因此其效率是必vector高的。
  • list比较,其底层是连续空间,空间利用率比较高,不需要存储额外字段。

劣势:

  • 但是,deque有一个致命缺陷:不适合遍历,因为在遍历时,deque的迭代器要频繁的去检测其是否移动到某段小空间的边界,导致效率低下
  • 中间元素插入删除时间复杂度高

简单来说,他的规避了vector和list的劣势,他的劣势是没有vector和list那么极端的优势(如vector的随机访问,list的插入删除)。

4.45为什么选择deque作为stackqueue的底层默认容器

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

 总结:

这节课我们学了容器适配器vector、list类的模拟、deque的底层设计,看到了他迭代器的复杂应用

觉得有用的话就点个赞支持一下吧 😘😘😘

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

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

相关文章

Endnote(作者,年份)文中引用显示‘and etal‘与‘和 等‘

软件版本&#xff1a;Endnote X9.1&#xff0c;样式&#xff1a;Harvard&#xff0c;其余使用(作者&#xff0c;年份)的样式均可&#xff0c;GBT7714就有作者年份类型 本教程适用于X系列~ Endnote20及以上版本请移步另一条博文&#xff0c;指路&#xff1a;&#xff08;我还没…

“双碳”目标下资源环境中的可计算一般均衡(CGE)模型教程

原文链接&#xff1a;“双碳”目标下资源环境中的可计算一般均衡&#xff08;CGE&#xff09;模型https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247599079&idx4&sn82ea6c6f506cd20d1e0cd590faaa0611&chksmfa820200cdf58b16dc5b79746901cc9a4048b46db5…

《自动机理论、语言和计算导论》阅读笔记:p5-p27

《自动机理论、语言和计算导论》学习第2天&#xff0c;p5-p27总结&#xff0c;总计23页。 一、技术总结 1.集合 (1)commutative law of union. (2)distribute law of union. 2.归纳法(induction) & 演绎法(deduction) (1)归纳法&#xff1a;从许多个别的事实或原理中…

【zlm】问题记录:chrome更新引起的拉不出webrtc; 证书校验引起的放几秒中断

目录 chrome更新引起的拉不出webrtc 证书校验引起的放几秒中断 chrome更新引起的拉不出webrtc 【zlm】最新的chrome版本中的报错&#xff1a; 我有个问题event.js:8 [RTCPusherPlayer] DOMException: Failed to execute setRemoteDescription on RTCPeerConnection: Failed …

LabVIEW焓差试验室流量计现场自动校准系统

LabVIEW焓差试验室流量计现场自动校准系统 在现代工业和科研领域&#xff0c;流量计的准确性对于保证生产过程的质量和效率非常重要。开发了一种基于LabVIEW的焓差试验室流量计现场自动校准系统&#xff0c;通过提高流量计校准的准确性和效率。 在空调器空气焓值法能效测量装…

hololens 2 投屏 报错

使用Microsoft HoloLens投屏时&#xff0c;ip地址填对了&#xff0c;但是仍然报错&#xff0c;说hololens 2没有打开&#xff0c; 首先检查 开发人员选项 都打开&#xff0c;设备门户也打开 然后检查系统–体验共享&#xff0c;把共享都打开就可以了

【k8s】kubeasz 3.6.3 + virtualbox 搭建本地虚拟机openeuler 22.03 三节点集群 离线方案

kubeasz项目源码地址 GitHub - easzlab/kubeasz: 使用Ansible脚本安装K8S集群&#xff0c;介绍组件交互原理&#xff0c;方便直接&#xff0c;不受国内网络环境影响 拉取代码&#xff0c;并切换到最近发布的分支 git clone https://github.com/easzlab/kubeasz cd kubeasz gi…

C++细节

背景知识&#xff1a; 面向对象的编程中&#xff0c;类&#xff08;Class&#xff09;是创建对象的蓝图或模板&#xff0c;它包含了数据&#xff08;通常称为属性或变量&#xff09;和行为&#xff08;通常称为方法或函数&#xff09;。将数据封装为私有&#xff08;private&am…

【Java】:类和对象

1.面向对象的初步认知 1.1 什么是面向对象 Java是一门面向对象的语言&#xff0c;在面向对象的世界里&#xff0c;一切皆为对象。面向对象是解决问题的一种思想&#xff0c;主要依靠对象之间的交互完成一件事情。用面向对象的思想来涉及程序&#xff0c;更符合人们对事物的认知…

CDNS PCIe VIP debug info

1. TLP payload的顺序是反向的&#xff0c;即大小端反的&#xff0c;比如下面的denalirc打印的信息看&#xff0c;pl是我们发TLP时的配置&#xff0c;Cfg才是真正的data顺序。 而seq写的时候如下&#xff1a;可以看到payload[2]时第三个8bit payload&#xff0c;但是我们是想配…

JS加密解密之应用如何保存到桌面书签

前言 事情起因是这样的&#xff0c;有个客户解密了一个js&#xff0c;然后又看不懂里边的一些逻辑&#xff0c;想知道它是如何自动拉起谷歌浏览器和如何保存应用到书签的&#xff0c;以及如何下载应用的。继而诞生了这篇文章&#xff0c;讲解一下他的基本原理。 渐进式Web应用…

UE5学习日记——蓝图节点前缀关键字整理

一、起因 节点如海&#xff0c;中英文翻译的时候还是有差别的&#xff0c;比如&#xff1a; 同一个中文&#xff0c;可能在英文里完全不同&#xff0c;连出现位置可能都不一样 附加 Attach Actor To Component&#xff08;将Actor附加到组件&#xff09;Append Array&#xf…

【竞技宝】DOTA2-PGL联赛:niu神无解 LGD2-0轻松击败DH

北京时间2024年3月26日,PGL联赛中国区的比赛在昨日正式打响,首日共进行了四场胜者组首轮的比赛,第四场比赛由LGD对阵DH。本场比赛,DH两局都在前中期和LGD有来有回,但niu的中期节奏完全摧毁了DH,最终LGD2-0轻松击败DH。以下是本场比赛的详细战报。 第一局: 首局比赛,LGD在天辉方…

Python Flask框架 -- flask-migrate迁移ORM模型

# 之前使用的这个db.create_all()很有局限性&#xff0c;它不能把在class里修改的东西同步上数据库&#xff0c;所以不用了 # with app.app_context(): # 请求应用上下文 # db.create_all() # 把所有的表同步到数据库中去 例如&#xff0c;在User类中增加一个email字段&…

selenium自动化测试-unittest框架

unittest框架的优点 (1)能够组织多个用例去执行 (2)提供丰富的断言方法 (3)能够生成测试报告 unittest框架的核心要素 1. TestCase测试用例 TestCase(测试用例)&#xff0c;最小的测试单元&#xff0c;创建的测试类需要继承该基类 步骤&#xff1a; &#xff08;1&#x…

Vue2(十一):全局事件总线、消息订阅与发布pubsub、TodoList的编辑功能、$nextTick、过渡与动画

一、全局事件总线 1、思路解析 一种组件间通信的方式&#xff0c;适用于任意组件间通信。通俗理解就是一个定义在所有组件之外的公共x&#xff0c;这个x可以有vm或vc上的同款$on、$off、$emit&#xff0c;也可以让所有组件都访问到。 第一个问题&#xff1a;那怎样添加这个x才…

代码随想录学习Day 18

530.二叉搜索树的最小绝对差 题目链接 讲解链接 思路&#xff1a;利用二叉搜索树的性质&#xff0c;其中序遍历序列是一个有序数组。所以先对二叉搜索树进行中序遍历&#xff0c;得到一个递增的数组后&#xff0c;再遍历整个数组&#xff0c;依次求相邻值的差&#xff0c;最…

java算法汇总(蓝桥常用-->自总版)(更新中...)

这里写目录标题 1.递归求n的阶乘2.互质3.例题:奇妙的数字两个数字拼接String.toCharArray()方法String.valueOf()方法 4.例题:美丽的2String.contains()方法 5.ASCII码---a,A,0的转换6.String[] a---->求sum(a[p].charAt(q))-0;7.复数BigInteger 大整数类型本题用到的方法--…

【SSH配置公钥私钥免密登录】

SSH配置公钥私钥免密登录 SSH的安全机制一、修改远程主机ssh设置二、在windows客户端生成公钥私钥文件三、将客户端公钥追加到远程主机 .ssh/authorized_keys中参考链接 SSH的安全机制 SSH之所以能够保证安全&#xff0c;原因在于它采用了非对称加密技术(RSA)加密了所有传输的…

28---Nand Flash电路设计

视频链接 Nand flash电路设计01_哔哩哔哩_bilibili NAND FLASH电路设计 1、NAND FLASH介绍 Nand-flash内存是flash内存的一种&#xff0c;其内部采用非线性宏单元模式&#xff0c;为固态大容量内存的实现提供了廉价有效的解决方案。Nand-flash具有容量较大&#xff0c;改写…