stackqueuepriority_queue

news2025/5/25 19:16:11

目录

一、容器适配器

二、deque

1、deque的相关函数

2、关于deque

3、deque的底层实现

4、deque的设计缺陷

5、结论

三、stack

1、stack的相关函数

2、stack相关函数使用

3、stack模拟实现

四、queue

1、queue的相关函数

2、queue相关函数使用

3、queue的模拟实现

五、priority_queue

1、priority_queue的相关函数

2、priority_queue的使用


一、容器适配器

首先适配器是一种设计模式,是将一个类的接口转化为客户希望的另一个接口

stack和queue没有被划分为容器,而被称为容器适配器,因为stack、queue和priority_queue只是对其他容器的接口进行了包装,stack、queue和priority_queue默认使用deque,如下图所示:


二、deque

这里有一个新容器需要介绍,因为接下来说到的stack、queue的第二个参数,即缺省参数都给的是deque

所以需要了解一下这个新容器

1、deque的相关函数

2、关于deque

首先使用deque需要包头文件deque    

大家观察deque的函数可知:

deque相比于vector支持头插头删,而相比于list又支持随机访问,相当于vector与list的合体

所以deque既支持任意位置的插入删除,又支持随机访问

但是deque实际并不是想象中的全能,大家可以想想如果真的这么好,那直接学deque就好了,为什么还要学vector和list呢,具体原因看下面的分析:


3、deque的底层实现

deque是双端队列

具体是这种样子:

deque有一个个小数组buffer,每一个小数组存储一部分数据,如果尾插空间满了就在后面再开一个小数组buffer,如果要头插就在前面再开一个小数组buffer

有一个中控的指针数组,每个位置存的都是指针,指向小数组buffer

并且有一个细节,在申请第一个buffer,即上图最中间的小数组时,不是从数组第一个位置申请的,它是从中控指针数组的中间开始申请的,如图所示扩容时,然后后面的buffer的指针的位置在数组中第一个buffer指针位置的后面,前面的buffer的指针的位置在数组中第一个buffer指针的前面

假设每个小数组的buffer是8个空间满,那么头插尾插扩容后应该如下所示的情况:

尤其需要注意的是,头插扩容时,buffer中是从右往左插入数据的

明白了deque是怎么支持任意位置的插入删除,再来看deque是如何支持随机访问的:

比如说,要访问第n个数据该怎么访问呢?

很简单,有两个公式:

(i - 第1个buffer中元素个数) / 8:这个公式算的是该元素在第几个buffer中

( i - 第1个buffer中元素个数) % 8:这个公式算的是该元素在那个buffer中的第几个位置

这便是deque如何支持[],也就是如何支持随机访问的

4、deque的设计缺陷

①operator[]计算较为复杂,若大量使用,性能下降

②在中间的插入删除效率不高

5、结论

①相比于vector和list,deque非常适合头尾的插入删除,所以deque非常适合做stack、queue的默认适配容器

②中间的插入删除多用list

③随机访问多用vector


三、stack

栈满足后进先出的特点,即last-in first-out,LIFO

1、stack的相关函数

2、stack相关函数使用

按顺序插入1,2,3,4,使用push,empty,top,pop函数进行操作,观察图片及打印结果理解用法

stack和queue的使用基本就是这些,剩下结合前面的容器使用也完全能够学会,下面模拟实现具体说明相关知识

3、stack模拟实现

首先我们在自己的命名空间中模拟实现stack

可以观察到stack的模板参数有两个,一个是数据类型T,一个是Container,即是一个容器

也可以看到模拟实现的stack类中的成员是Container _con,即只要满足相关的push、pop、top、empty、size等功能的容器都可以在使用时当模板参数传入

如下即是模拟实现stack的代码:

下面看容器适配器的具体使用:

大家可以看到我们在使用stack时是用的fcy命名空间的,所以测试的内容都是我们自己模拟实现的

可以观察到,平时使用stack时是stack<int>这样使用,而用了容器适配器后,可以选择自己想要的底层容器,这里我们传入了vector,因为vector可以满足stack的基本功能,所以传入vector就可以适配出这里的stack

当然不只有vector满足,list也是满足的,所以这里传入list也是输出结果相同的:

vector和list都能满足stack的基本功能,所以我们都可以传入,我们并不关心传入的是什么容器,只要能适配出stack就可以

而我们都知道,vector和list的底层是不同的,但是都能传入后都能够适配出我们想要的stack,这才叫我们所说的适配器

而我们上面讲的deque就是默认的容器,即我们需要给stack一个默认的容器,这样在我们不传指定的容器时,都默认使用deque适配,即在模板参数部分给一个缺省值

这样我们使用时,就不需要在手动传容器了,即:



四、queue

队列满足先进先出的特点,即first-in first-out,FIFO

1、queue的相关函数

2、queue相关函数使用

按顺序插入1,2,3,4,使用push,empty,front,pop函数进行操作,观察图片及打印结果理解用法


3、queue的模拟实现

我们在自己的命名空间中模拟实现stack

和stack一样,模板参数有两个,一个是数据类型T,一个是Container,即是一个容器,默认使用deque

只要满足相关的push、pop、back、front、empty、size等功能的容器都可以在使用时当模板参数传入

如下即是模拟实现queue的代码:

下面具体测试在fcy命名空间里模拟实现的queue的功能,默认可以不传容器:

当然我们也可以传入list容器适配queue,即:

这里不能用vector适配,是因为vector并不支持头部的删除,queue是尾部插入头部删除的


五、priority_queue

priority_queue叫做优先级队列,底层是一个堆

priority_queue也是一个容器适配器

priority_queue有三个模板参数:

第一个是数据类型

第二个是一个容器,默认用vector适配,因为随机访问比较多

第三个是仿函数,关于排序的函数,默认大堆,可以自己模拟实现一个传入

1、priority_queue的相关函数

2、priority_queue的使用

priority_queue构造函数可以传入迭代器初始化

如下所示,用数组初始化,默认大堆,打印出来是降序:

如果想变成小堆,升序输出,则需要改变仿函数,变为greater,greater包含在头文件functional中

并且如果要自己传入第三个参数仿函数,那第二个参数也是要手动传入的,即:


priority_queue的使用也非常简单,如下图就是最常用的四个函数的使用,push、pop、empty、top

通过输出结果可以明白,优先级队列是默认大堆,因为每次取堆顶的数据,然后pop,取出来是最大的

如果想变成小堆,升序输出,则需要改变仿函数,变为greater,greater包含在头文件functional中

并且如果要自己传入第三个参数仿函数,那第二个参数也是要手动传入的,即:

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

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

相关文章

2023-9-14 数字三角形

题目链接&#xff1a;数字三角形 #include <iostream> #include <algorithm>using namespace std;const int N 510, INF 1e9;int n; int a[N][N]; int f[N][N];int main() {cin >> n;for(int i 1; i < n; i )for(int j 1; j < i; j )cin >> …

书剑宠物疫苗接种管理软件操作教程

【软件简介】 书剑宠物疫苗接种管理软件是一款宠物疫苗接种管理的工具&#xff0c;适合宠物诊所使用。具有动物主人建档、宠物疫苗接种登记管理、每日提醒、打印疫苗接种通知卡、自定义短信提醒模板等完善的功能。 另外本软件的特色是同时具有手机网页版功能&#xff0c;手机…

全球十大优质炒黄金交易APP平台排名(信息汇总)

由于近些年全球通货膨胀高企&#xff0c;炒黄金交易平台越来越受到人们的关注。然而&#xff0c;如何在众多的平台中选择适合自己的平台&#xff0c;却是一个值得思考的问题。 随着移动互联网的快速发展&#xff0c;越来越多的投资者更倾向于通过手机APP来炒黄金。本文将为大…

Contents:帮助公司为营销目的创建内容

【产品介绍】 名称 Contents上线时间 2017年5月 具体描述 Contents是一家提供基于人工智能的内容生成平台的企业&#xff0c;可以帮助用户在各种网站和工具中使用最先进的机器学习模型&#xff0c;实现视频编辑、图像生成、3D建模等内容创作。【团队介绍…

“掌握技巧,轻松调整视频时长:打造完美短视频分享“

在今天的高速信息时代&#xff0c;视频已成为我们传递信息和娱乐的主要方式之一。但有时候&#xff0c;视频的时长可能会超出我们的预期&#xff0c;或者我们希望在特定的时间内呈现内容。那么&#xff0c;如何调整视频的时长呢&#xff1f;下面&#xff0c;我们将分享几种简单…

聚精品,通全球 2024中国(杭州)国际电商物流包装产业展览会四月隆重开幕

2024中国&#xff08;杭州&#xff09;国际电商物流包装产业展览会 2024年4月12-14日 | 杭州国际博览中心 同期举办&#xff1a;2024长三角快递物流供应链与技术装备展览会&#xff08;杭州&#xff09; 2024中国&#xff08;杭州&#xff09;国际数字物流技术与应用展览会 展会…

Bearly:基于人工智能的AI写作文章生成工具

【产品介绍】 名称 Bearly 具体描述 Bearly是一个AI人工智能内容创作工具。你可以用Bearly来阅读、写作、创作&#xff0c;提高你的效率。包括使用Bearly来生成网页的摘要、标题、关键点&#xff0c;也可以用Bearly来生成创意内容、艺术图片、文案编辑等。帮助你克…

git工具下载和安装

(1)从git官网下载安装包 然后安装 https://git-scm.com/downloads (2)git 学习参考官方的资料 https://git-scm.com/book/en/v2

PADS出GERBER时 焊盘丢失、焊盘变形问题

一、PCB设计软件PADS出GB焊盘丢失问题解决方案 PCB设计软件PADS出GB焊盘丢失原因&#xff1a;PADS斜角焊盘在输出gerber时需要填充&#xff0c;当填充的线过大(比焊盘宽度大)就会出现焊盘丢失。 问题解决方法&#xff1a;输出光绘时将“填充线宽”改小。 二、PCB设计软件PADS出…

单链表和双链表

单链表和双链表 单链表&#xff1a;只有一个指向下一节点的指针 --> 单向读取 双链表&#xff1a;既有指向下一节点的指针&#xff0c;也有指向上一节点的指针&#xff0c;可以通过此向前查找 单链表和双链表的反转&#xff1a;逆序 整个链表逆序、部分链表逆序&#…

【数据分享】2001-2022年我国省市县镇四级的逐月降水量数据(免费获取/Shp/Excel格式)

气象数据在日常研究中非常常用&#xff0c;之前我们分享过来自国家青藏高原科学数据中心提供的1901-2022年1km分辨率逐月降水栅格数据以及基于该数据处理而得到的1901-2022年1km分辨率的逐年降水栅格数据&#xff08;可查看之前的文章获悉详情&#xff09;&#xff01; 本次我…

设置伙伴(buddy)-给窗口控件增加快捷键

在官方教程或者很多qt程序中经常看到能使用全键盘操作软件&#xff0c;那么QT creator也支持了这一特性&#xff0c;就是使用设置伙伴来实现的。 我们可以在设计界面按照如下几步实现&#xff1a; 先放置label 再放置一个lineEdit控件。 这个时候我们就可以开始伙伴绑定的步骤…

初试占比70%,计算机招生近200人,安徽理工大学考情分析

安徽理工大学 考研难度&#xff08;☆&#xff09; 内容&#xff1a;23考情概况&#xff08;拟录取和复试分析&#xff09;、院校概况、23专业目录、23复试详情、各专业考情分析、各科目考情分析。 正文980字&#xff0c;预计阅读&#xff1a;3分钟 2023考情概况 安徽理工大…

小程序Saas平台源码:开启电商小程序新时代,可视化后台自由DIY的无限可能

在当今数字化的时代&#xff0c;小程序已成为各行各业开展业务的重要工具。尤其在电商领域&#xff0c;小程序能有效地缩短消费者与商品之间的距离&#xff0c;提升营销效率。给大家分享一款针对电商行业的小程序Saas平台源码&#xff0c;它具有一键生成电商小程序、可视化后台…

【mars3d学习】淹没分析,计算最高最低值出错

问题一&#xff1a;淹没分析&#xff08;地形分析&#xff09; Mars3d淹没分析的示例 - 功能示例(Vue版) | Mars3D三维可视化平台 | 火星科技 初始化一个polygon面的时候&#xff0c;使用 mars3d.PolyUtil.interPolygonByDepth 直接计算淹没的最大最小高度值&#xff1b; 但…

【深度学习】 Python 和 NumPy 系列教程(十九):Matplotlib详解:2、3d绘图类型(5)3D等高线图(3D Contour Plot)

目录 一、前言 二、实验环境 三、Matplotlib详解 1、2d绘图类型 2、3d绘图类型 0. 设置中文字体 1. 3D线框图&#xff08;3D Line Plot&#xff09; 2. 3D散点图&#xff08;3D Scatter Plot&#xff09; 3. 3D条形图&#xff08;3D Bar Plot&#xff09; 4. 3D曲面图…

AIGC(生成式AI)试用 4 -- 从模糊到精确

从模糊到精确&#xff0c;也许差异在于 更多的描述&#xff0c;更多的信息更具像的描述&#xff0c;更多的数据&#xff0c;更有效的信息主题明确和目标清晰层次感与条理性更简洁清晰的逻辑 “说清楚点&#xff0c;不太明白&#xff0c;提供更多的信息也许能知道要做什么。” …

GIS前端-地图操作与交互

GIS地图操作与交互 地图操作与交互基本原理Leaflet提供的事件缩放控件 常用的基础功能通常是一个应用系统所必需的&#xff0c;如地图的缩放、导航、定位、弹出框等&#xff0c;它让一张静态的地图动起来&#xff0c;让地图承载更多的空间信息&#xff0c;并以友好的交互方式呈…

YOLOv5:修改backbone为ConvNeXt

YOLOv5&#xff1a;修改backbone为ConvNeXt 前言前提条件相关介绍ConvNeXtYOLOv5修改backbone为ConvNeXt修改common.py修改yolo.py修改yolov5.yaml配置 参考 前言 记录在YOLOv5修改backbone操作&#xff0c;方便自己查阅。由于本人水平有限&#xff0c;难免出现错漏&#xff0c…

算法分析与设计编程题 回溯法

装载问题 题目描述 解题代码 递归回溯 // goods[i]表示货物i的重量, c1,c2分别表示货船1和货船2的载重量 vector<vector<int>> optimalLoading(vector<int>& goods, int c1, int c2) {int n goods.size(); // 货物数量int maxSum 0; // 当前最大载货…