STL中queue、stack的实现与容器适配器的讲解

news2024/11/14 3:40:30

目录

简介

栈(Stack)

队列(Queue)

实现

栈的实现

队列的实现

deque的讲解

deque的结构示意图


简介

栈(Stack)和队列(Queue)是两种基本的数据结构,在STL(Standard Template Library,标准模板库)中,它们被封装为容器适配器,用于管理元素的插入和删除操作。

栈(Stack)

栈是一种后进先出(Last In First Out, LIFO)的数据结构。在STL中,栈的接口定义如下:

  • push():在栈顶插入一个元素。
  • pop():删除栈顶元素。
  • top():返回栈顶元素的引用。
  • empty():检查栈是否为空。
  • size():返回栈中元素的数量。

栈通常用于以下场景:

  • 递归算法的实现。
  • 实现后退功能,如浏览器的后退按钮。
  • 解决问题时的临时存储,如深度优先搜索(DFS)。

队列(Queue)

队列是一种先进先出(First In First Out, FIFO)的数据结构。在STL中,队列的接口定义如下:

  • push():在队列末尾插入一个元素。
  • pop():删除队列首部的元素。
  • front():返回队列首部元素的引用。
  • back():返回队列末尾元素的引用。
  • empty():检查队列是否为空。
  • size():返回队列中元素的数量。

队列通常用于以下场景:

  • 在多任务处理中管理任务,如线程池。
  • 实现广度优先搜索(BFS)。
  • 缓存实现,如最近最少使用(LRU)缓存。

在STL中,栈和队列通常是基于deque(双端队列)或list(链表)来实现的,但用户不需要关心底层实现细节,可以直接使用它们提供的接口来进行操作。这两种数据结构都是模板类,可以存储任何类型的元素。

由于我们需要深度学习这两种数据结构,因此本文将实现stack与queue

实现

栈的实现

栈可分数组站、链表栈,都可以实现后进先出的功能。我们可以采用C语言中借助一个动态指针等方式实现。但是在C++中,可以借助其他容器实现。

对于stack而言,既可以使用list,也可以使用vector、、、

template<class T, class Container = std::deque<T>>
class stack
{

官网中stack的实现借助的是模板

因此我们也借助模板实现。

模板参数由数据类型T和容器类型Container构成。

栈的功能函数

栈主要是top        pop        push这三个核心函数构成。


namespace My_Stack
{
	template<class T, class Container = std::deque<T>>
	class stack
	{
	public:
		void push(const T& x)
		{
			_con.push_back(x);
		}

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

		const T& top() const
		{
			return _con.back();		//back不是front
		}

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

		size_t size() const
		{
			return _con.size();
		}
	private:
		Container _con;		//默认生成的构造函数,会调用_con的构造
	};

}

需要注意的是:

对于构造函数、析构函数等内置函数,我们并没有显式实现。系统默认生成的构造函数会自动调用_con该容器的构造,析构函数也会调用该容器的析构完成资源的清理。

top是栈顶元素,也就是容器的最后一个元素。

队列的实现

队列也是一个模板类,但是队列的容器不能是vector,原因是vector没有pop_front()函数,而队列需要大量的先进先出。

#include <deque>

namespace My_Queue
{
	template<class T, class Container = std::deque<T>>
	class queue
	{
	public:
		void push(const T& x)
		{
			_con.push_back(x);
		}

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

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

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

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

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

	private:
		Container _con;
	};


}

deque的讲解

可以看到,我们在实现队列和栈的时候,都利用了deque,这是什么呢?

Deque(双端队列)是一种数据结构,它允许在队列的两端进行插入和删除操作。它是“double-ended queue”的缩写,有时也被称为双端队列容器

在 C++ 的 STL(标准模板库)中,deque 与 vector 容器有很多相似之处,但它们之间也存在一些关键的区别。与 vector 不同的是,deque 在队列的两端(头部和尾部)添加或删除元素的效率都非常高,时间复杂度为 O(1)。这意味着 deque 在频繁进行头部或尾部操作时,比 vector 更高效

其实deque同样可以成为完成栈和队列的容器。

以下是 deque 的一些特点:

  1. 双向开口:deque 是一种双向开口的连续线性空间,允许在头尾两端分别进行元素的插入和删除操作。

  2. 动态空间管理:deque 没有固定的容量概念,它是动态地以分段连续空间组合而成,可以根据需要随时增加新的空间。

  3. 高效的头尾操作:与 vector 相比,deque 在头部进行插入和删除操作时效率更高,因为不需要移动所有元素。

  4. 迭代器:deque 的迭代器需要能够指出分段连续空间的位置,并且能够判断是否处于当前缓冲区的边缘。如果是,则在进行前进或后退操作时,需要跳跃到下一个或上一个缓冲区。

如下是deque的函数

看函数,像是list与vector的结合体。它既能实现list的功能,也能实现vector的功能。那为什么不能deque呢?主要还是,他什么都会,但是什么都不精通

因此,根据需求,我们还是主要使用list和vector。但是,当需要在序列的两端频繁进行添加或删除操作时,deque 容器是一个很好的选择。

deque的结构示意图

deque其实是一个中控数组实现,数组中存放着一个个的指针,指向了其他容器(一般被乘坐buffer)。

其实,本质是个指针数组!

头插与尾插示意图

头插:在10之前

中控满了,可以去扩容,但是代价低,因为这只是一个指针数组,只需要拷贝指针。

但是在内部插入删除元素,就显得效率极其低下!因为要么得整体挪动数据,以保证buffer的大小一致,方便[]访问;要么得对单个的buffer扩容,或者减少数据。

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

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

相关文章

【面积图表美化示例+讲解】

文章目录 效果预览&#xff1a;半透面积图&#xff1a;百分比堆积图&#xff1a; 效果预览&#xff1a; 半透面积图&#xff1a; 思路&#xff1a; 实际上是由两种类型的图表叠在一起&#xff0c;【面积图折线图】 处理&#xff1a; [1] 为了让面积图的边缘更加清晰&#xff…

ts发送邮箱,以网易邮箱来演示

①引入依赖&#xff1a; npm i nestjs-modules/mailer nodemailer 这里是引入相应的需要的依赖。 创建模块&#xff0c;以及服务 nest generate module sendEmail nest generate service sendEmail ②在app.module中注册&#xff0c;之后在其它的模块就可以使用 import { M…

员工飞单、走私单、离职带走客户,屡禁不止怎么办?1招防止!

企业面临着诸多挑战&#xff0c;其中员工行为不端&#xff0c;如飞单、走私单以及离职时带走客户等问题&#xff0c;不仅损害了企业的经济利益&#xff0c;更侵蚀了企业的市场竞争力与客户信任度。 这些问题如同一颗颗毒瘤&#xff0c;若不及时清除&#xff0c;将严重阻碍企业…

简而不减,极致便捷!泰极预付费解决方案震撼上市

开户麻烦!绑表复杂!用电情况模糊!电费收缴难! 在日常生活中,能源缴费可能经常会遇到运维难管理、缴费收益难计算、支付安全难保障等问题。如何解决呢?正泰物联推出“泰极预付费解决方案”,“简”操作,“不减”功能,有效解决上述问题,助力实现便捷生活。 享轻松:泰极简而不减…

three.js 编辑器,动画,着色器, cesium 热力图,聚合点位,大量点线面, 图层,主题,文字

对于大多数的开发者来言&#xff0c;看了很多文档可能遇见不到什么有用的&#xff0c;就算有用从文档上看&#xff0c;把代码复制到自己的本地大多数也是不能用的&#xff0c;非常浪费时间和学习成本&#xff0c; 尤其是three.js &#xff0c; cesium.js 这种难度较高&#xff…

【计算机组成原理】五、中央处理器:3.指令流水线(互斥、同步)

5.指令流水线 文章目录 5.指令流水线5.1基本概念5.2性能指标5.3指令流水线影响因素5.3.1结构相关&#xff08;**资源冲突**&#xff09;&#xff1a;**互斥**5.3.2数据相关&#xff08;**数据冲突**&#xff09;&#xff1a;**同步**5.3.3控制相关&#xff08;**控制冲突**) 5.…

电脑网络设置

有时候开机会发现电脑明明练了Wifi却无法上网&#xff0c;是因为之前梯子没关直接关机&#xff0c;解决方案是 打开设置网络和Internet代理手动设置代理关闭“使用代理服务器”

黑马JavaWeb开发笔记10(前端完结)——Vue路由介绍入门、前端工程打包、nginx前端部署

文章目录 前言一、Vue路由1. 介绍2. 路由入门 二、打包部署1. 前端工程打包2. 部署前端工程2.1 nginx介绍2.2 部署 总结 前言 本篇文章是2023年最新黑马JavaWeb开发笔记10&#xff1a;Vue路由介绍&入门、前端工程打包、nginx前端部署的总结&#xff0c;帮助需要学习Web开发…

6款文件恢复软件推荐,电脑小白也能够一人做到电脑数据恢复!

在一台小小的电脑里&#xff0c;有着我们学习资料的整理、工作文件的痕迹和生活点滴的回忆&#xff0c;正因为这些数据对我们来说是十分珍重的东西&#xff0c;所以会难以承受它们丢失不见的结果。 一旦造成数据丢失&#xff0c;我们该怎么做才能把这些重要的数据文件找回呢&a…

科研绘图之折线图

在科研数据分析中&#xff0c;折线图是一种常见且有效的可视化工具&#xff0c;用于展示数据随时间或其他连续变量的变化趋势。Python&#xff0c;作为一种强大的编程语言&#xff0c;提供了多种绘制折线图的工具和库&#xff0c;其中最常用的包括 Matplotlib 和 Seaborn。 Ma…

vscode解决运行程序无法从控制台输入问题

在vscode中运行一些简单的程序代码&#xff0c;需要从控制台接受输入参数&#xff0c;发现不能通过键盘输入。 本章教程&#xff0c;提供该问题的解决方法。 解决办法 由于我是使用的Code Runner这个插件&#xff0c;Code Runner插件支持运行多种编程语言&#xff0c;很方便。打…

如何构建基于Java SpringBoot和Vue的受灾救援物资管理系统?——四步实现物资高效调配,提升救援响应速度

&#x1f34a;作者&#xff1a;计算机毕设匠心工作室 &#x1f34a;简介&#xff1a;毕业后就一直专业从事计算机软件程序开发&#xff0c;至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长&#xff1a;按照需求定制化开发项目…

国外服务器独立ip的好处

国外服务器提供独立IP服务&#xff0c;这为网站运营者、企业用户以及个体户提供了诸多便利。独立IP即一个独一无二的IP地址&#xff0c;专为一个网站或一项服务&#xff0c;相较于共享IP&#xff0c;独立IP拥有许多不可替代的优势。下面将介绍国外服务器提供独立IP服务的好处&a…

C#生成exe并用process运行

文章目录 前言一、生成exe1.发布自包含版本2.一些问题1. 使用 .NET Framework修改项目文件 二、使用Process调用exe子进程阻塞了父进程&#xff1a;资源锁定&#xff1a;无限循环&#xff1a;命令行挂起&#xff1a;1.解决方法示例代码 说明1.启动 EXE 文件&#xff1a;2.启动 …

开源项目管理工具Taiga

什么是 Taiga &#xff1f; Taiga 是一个免费开源&#xff0c;而且功能非常强大的项目管理平台&#xff0c;用于初创企业和敏捷开发团队。Taiga 专注于简洁性&#xff0c;并且界面很干净简单。Taiga 也非常个性化&#xff0c;并集合了很多其它功能和外部工具&#xff0c;还有大…

如何恢复最近删除的文件?5种简单方法!

数据丢失在我们的工作生活中经常发生。当你决定清理硬盘或U盘时&#xff0c;你会删除一些文件夹或文件。如果你通过右键单击删除文件&#xff0c;则可以很容易从回收站恢复已删除的文件。但是&#xff0c;如果你按Shift Delete键、清空回收站或删除大于8998MB的大文件夹&#…

智能优化特征选择|基于鲸鱼WOA优化算法实现的特征选择研究Matlab程序(XGBoost分类器)

智能优化特征选择|基于鲸鱼WOA优化算法实现的特征选择研究Matlab程序&#xff08;XGBoost分类器&#xff09; 文章目录 一、基本原理鲸鱼智能优化特征选择流程 二、实验结果三、核心代码四、代码获取五、总结 智能优化特征选择|基于鲸鱼WOA优化算法实现的特征选择研究Matlab程序…

丹娜生物增利不增收:核心产品原材料面临不利因素,销售费用率攀升

《港湾商业观察》黄懿 7月15日&#xff0c;丹娜&#xff08;天津&#xff09;生物科技股份有限公司&#xff08;下称“丹娜生物”&#xff09;针对北交所出具的IPO问询文件进行了首轮回复&#xff0c;其保荐人为招商证券。7月26日&#xff0c;监管部门发出第二封问询函。 公开…

分布式场景下websocket解决方案

在项目中遇到&#xff1a;多个服务作为websocket服务端时&#xff0c;怎么跟前端设备进行数据通信的问题。具体解决方案&#xff0c;分享一下。 1.遇到问题 项目中使用websocket与前端设备建立长链接&#xff0c;用于推送过车、车位数、支付等相关信息&#xff0c;由于项目是负…

监控摄像头内存卡格式化了怎么恢复?

监控摄像头在现代社会中的应用越来越广泛&#xff0c;无论是家庭安防还是商业场所的安全监控&#xff0c;它们都扮演着重要的角色。然而&#xff0c;内存卡的数据丢失问题也时有发生&#xff0c;尤其是当内存卡被不小心格式化时&#xff0c;很多重要的监控数据可能会永久丢失。…