priority_queue的常见用法详解

56 篇文章 40 订阅
订阅专栏

前言

priority_queue又称为优先队列,其底层是用堆来进行实现的。在优先队列中,队首元素一定是当前队列中优先级最高的那一个(默认是大根堆)。
例如在队列有如下元素,且定义好了优先级:

桃子(优先级3)
梨子(优先级4)
苹果(优先级1)
那么出队的顺序为:  梨子(4)->桃子(3)->苹果(1)

当然,可以在任何时候往优先队列里面加入(push)元素。而优先队列底层的数据结构堆(heap)会随时调整结构,
使得每次的队首元素都是优先级最大的。
关于这里的优先级是规定出来的。例如上面的例子中,也可以规定数字越小的优先级越大。

priorithy_queue的定义

要使用优先队列,需要的头文件:

#inlcude<queue>

需要的其他东西:

using namespace std;

其定义的写法和其他STL容器相同,typename可以是任意基本数据类型或容器:

priority_queue<typename>name;

priority_queue容器内元素的访问

和队列不一样的是,优先队列没有front()和back()函数,
而只能通过top()函数来访问队首元素(也可以称为堆顶元素),也就是优先级最高的元素。
在这里插入图片描述

priority_queue常用函数

(1)push()
push(x)将令x入队,时间复杂度为O(logN),其中N为当前优先队列中的元素个数。
(2)top()
top()可以获得队首元素(即堆顶元素),时间复杂度为O(1)。
(3)pop()
pop()令队首元素(即堆顶元素)出队,时间复杂度为O(logN),其中N为当前优先队列中的元素个数。
在这里插入图片描述
(4)empty()
empty()检测优先队列是否为空,返回true则为空,返回false则为非空。时间复杂度为O(1)。
在这里插入图片描述
(5)size()
size()返回优先队列内元素的个数,时间复杂度为O(1)。
在这里插入图片描述

priority_queue内元素优先级的设置

如何定义优先级队列内元素的优先级是运用好优先队列的关键,下面分别介绍基本数据类型
(例如 int 、double、char)与结构体类型的优先级设置方法。
(1)基本数据类型的优先级设置
此处指的基本数据类型就是int型、double 型、char型等可以直接使用的数据类型,优先队列对它们的优先级设置般是数字大的优先级越高, 因此队首元索就是优先队列内元素最大的那个(如果char 型,则是字典序最大的)。
对基本数据类型来说,下面两种优先队列的定义是等价的(以int型为例,注意最后两个>之间有一个空格):

priority_queue<int> q;
priority_queue<int , vector<int> , less<int> > q;

可以发现,第二种定义方式的尖括号内多出了两个参数:一个是vector,另一个是less.其中vector (也就是第二个参数)填写的是来承载底层数据结构堆(heap)的容器,如果第一个参数是double型或char型,则此处只需要填写vector-或vector;而第三个参数less-则是对第一个参数的比较类, less表示数字大的优先级越大,而greater表示数字小的优先级越大。
因此,如果想让优先队列总是把最小的元素放在队首,只需进行如下定义:

priority_queue<int, vector<int>, greater<int> >a;

下面是一个示例:
在这里插入图片描述
事实上,即便是基本数据类型,也可以使用下面讲解的结构体的优先级设置方法,只不过第三个参数的写法不太一样了。
下面看一下结构体的优先级的设置方法。
(2)结构体的优先级设置
以一个水果的名称和价格为例:

struct fruit
{
	string name;
	int price;
};

现在希望按水果的价格高的为优先级高,就需要重载( overload )小于号 " < "。重载是指对已有的运算符进行重新定义,
也就是说,可以改变小于号的功能(例如把它重载为大于号的功能)

struct fruit
{
	string name;
	int price;
	friend bool operator < (fruit f1,fruit f2)
	{
		return f1.peice<f2.price;
	}
};

在这里插入图片描述

priority_queue<fruit> q;

同理,如果想要以价格低的水果为优先级高,那么只需要把return 中的小于号改为大于号即可。

struct fruit
{
	string name;
	int price;
	friend bool operator < (fruit f1,fruit f2)
	{
		return f1.price > f2.price;
	}
};

在这里插入图片描述
读者会发现,此处对小于号的重载与排序函数sort中的cmp函数有些相似,它们的参数都是两个变量,函数内部都是return了true或者false,
事实上,这两者的作用确实是类似的只不过效果看上去似乎是“相反”的。在排序中,如果是“return f1.price > f2.price",
那么则是按价格从高到低排序,但是在优先队列中却是把价格低的放到队首。原因在于,优先队列本身默认的规则就是优先级高的放在队首,因此把小于号重载为大于号的功能时只是把这个规则反向一下。
如果读者无法理解,那么不妨记住,优先队列的这个函数与sort()中的cmp函数的效果是相反的。

那么,有没有办法跟sort() 中的cmp函数那样写在结构体外面呢? 自然是有办法的。
只需要把friend 去掉, 把小于号改成一对小括号,然后把重载的函数写在结构体外面,同时将其用
struct包装起来。

struct cmp
{
	bool operator () (fruit f1,fruit f2)
	{
		return f1.price>f2.price;
	}
};

在这种情况下,需要用之前讲解的第二种定义方式来定义优先队列:

priority_queue<fruit,vector<fruit>,cmp> q;

可以看到此处只是把greater()部分换成了cmp
在这里插入图片描述
即便是基本数据类型或者其他STL容器(例如 set),也可以通过同样的方式来定义优先级。
如果结构体内的数据较为庞大(例如出现了字符串或数组),建议使用引用来提高效率。
此时比较类的参数中需要加上"const “和” &" 。

friend bool operator < (const fruit &f1,const fruit &f2)
{
	return f1.price>f2.price;
}
bool operator () (const fruit &f1, const fruit &f2)
{
	return  f1.price>f2.price; 
}

priority_queue的常见用途

priority_queue可以解决一些贪心问题,也可以对Dijkstra算法进行优化(因为优先队列的本质是堆)
有一点需要注意的是,使用pop()函数前,必须用empty()判断优先队列是否为空,否则可能因为队空而出现错误。

C++优先队列(priority_queue)用法详解
流楚丶格念的博客
11-16 8437
文章目录priority_queue优先队列介绍模板 参数priority_queue成员函数大顶堆与小顶堆大顶堆(降序)小顶堆(升序)注意事项代码案例 priority_queue 对于这个模板类priority_queue,它是STL所提供的一个非常有效的容器。 作为队列的一个延伸,优先队列包含在头文件 <queue> 中。 优先队列介绍 优先队列是一种比较重要的数据结构,它是有二项队列编写而成的,可以以O(log n) 的效率查找一个队列中的最大值或者最小值,其中是最大值还是最小值是根据创
PriorityQueue(优先队列)的用法
See_Csdn_的博客
03-24 1252
和普通队列相同的是,PriorityQueue也是满足FIFO(先进先出)的原则,不然就不是queue PriorityQueue提供了更加高级的功能,就是自动将队列里的元素进行排序 例子,我们学习中,各科都有一些作业,一些科目先布置了作业,我们就可以先完成,但有时候作业总是堆在了最后才想起要做作业了。我们可以盲目的去做,但可能聪明的人会按照一定的顺序去完成他们,比如越早交的,我们就先完成。虽然感觉有点不恰当,但是可以吧 说明 队列中的元素可以默认自然排序,也可以通过传入的compartor进行.
priority_queue的使用方法
最新发布
Awesomewan的博客
09-01 962
默认情况下,priority_queue 是一个最大堆(即大元素有更高的优先级),但有时候我们需要最小堆(即小元素有更高的优先级)或者自定义优先级顺序。这可以通过自定义比较函数或仿函数来实现。最小堆的实现// 创建一个最小堆的 priority_queue// 插入元素pq.push(5);// 输出并移除堆顶元素while (!// 输出堆顶元素pq.pop();// 移除堆顶元素return 0;自定义排序。
priority_queue
PZHU_CG_CSDN的博客
01-25 2万+
priority_queue  priority_queue 优先队列,其底层是用堆来实现的。在优先队列中,队首元素一定是当前队列中优先级最高的那一个。  在优先队列中,没有 front() 函数与 back() 函数,而只能通过 top() 函数来访问队首元素(也可称为堆顶元素),也就是优先级最高的元素。一、基本数据类型的优先级设置 此处指的基本数据类型就是 int 型,double 型,char
priority_queue 用法总结
silentskydream的专栏
04-14 4965
    今天在写堆和哈夫曼树的ACM题的时候,接触到priority_queue用法,由于比较函数的难些,请教过队内的红薯和杨大牛后才稍微弄明白些,下面总结如下,首先我是用手写的堆来过题的,其实和照黑书指导上的那个堆的代码差不多。   写完之后就看了下STL里面的priority_queue用法就开始研究,首先是用了网上找的一个写比较函数的方法是用操作符重载做的。代码如下://比较函数
priority_queue用法
桑凯旋的博客
02-18 565
priority_queue本质是一个堆。 头文件:#include&amp;amp;amp;lt;queue&amp;amp;amp;gt; 2. 关于priority_queue中元素的比较 函数原型: priority_queue&amp;amp;amp;lt;Type, Container, Functional&amp;amp;amp;gt; 其中Type 为数据类型,Container为保存数据的容器,Functional 为元素比较方式。Container必须是
c++优先队列(priority_queue)用法详解
12-23
首先要包含头文件#include<queue>, 他和queue不同的就在于我们可以自定义其中数据的优先级, 让优先级高的排在队列前面,优先出队。 优先队列具有队列的所有特性,包括队列的基本操作,只是在这基础上添加了内部的一个...
C++ 中"priority_queue" 优先级队列实例详解
08-30
首先,让我们详细了解一下`priority_queue`的基本使用方法: 1. **初始化**: 初始化`priority_queue`时,可以提供一个容器(如`std::vector`)的起始和结束迭代器,这样队列会自动包含这些元素。例如,在给定的...
priority_queue的使用
老猫的博客
03-04 633
priority_queue本质是一个堆。 头文件是#include 关于模板参数   模板申明带3个参数:priority_queue&lt;Type, Container, Functional&gt; Type 为数据类型 Container为保存数据的容器:必须是用数组实现的容器,比如vector,deque等等,但不能用 list。STL里面默认用的是vector。 Function...
priority_queue优先队列的使用方法
gaoqiandr的博客
08-16 3908
说到优先队列,大家肯定想到了队列(这肯定是对于学过队列的同学来说,当然了,没学过也没事,对于本篇文章没什么问题滴),队列的特征是后进后出,按照排队先来后到的顺序的,本篇文章介绍的priority_queue优先队列是按照优先级的顺序来排队,优先级我们可以把它理解成是一种规则,不像队列那样抽象的说是按照时间的,优先队列的这种规则我们可以自己自定义,接下来我们来看看具体的讲解。
c++ priority_queue用法 入门必看 超详细
weixin_52115456的博客
10-31 1万+
基本定义默认是使用大顶堆的,即队首总是最大的元素priority_queue 容器名如:储存int型数据的优先级队列 priority_queue q;储存double型数据的优先级队列 priority_queue q;储存string型数据的优先级队列 priority_queue q;储存结构体或者类的优先级队列 priority_queue q;less 即使用大顶堆。
PriorityQueue怎么用
热门推荐
TOOCRUEL
09-19 10万+
原文 https://www.toocruel.net/priorityqueue/ PriorityQueue简介 PriorityQueue是基于优先级堆的无界优先级队列。 他们的元素可按自然排序,也可在创建ProorityQueue实例时指定比较器。 不能添加null对象,也不能添加不可比对象,这样会抛出ClassCastException异常。 怎么用 采用自然排序的方式 import j...
<STL学习笔记>Priority_queue
weixin_34245749的博客
07-27 146
  优先队列是一种容器适配器(容器适配器的概念本人不会解释,故此处无法作出说明),它的第一个元素(位于头部top)总是队列中最大的元素,这里的“最大”是指队列元素的严格弱序中的“最大”。严格弱序是一系列数或事物按照一定的比较关系“&lt;”排列得出的序列,“&lt;”可以是数学中进行数值比较的大于,也可以是小于,还可以是其它含义,这大概与离散数学中的“偏序关系”相仿。     在内存充足的情况下...
priority_queue常见用法详解
weixin_52914088的博客
08-15 2万+
1,priority_queue 又称为优先队列,其底层是用堆来进行实现的。在优先队列中,队首元素一定是当前队列中优先级最高的那一个。 当然,可以在任何时候往优先队列里面加入元素,而优先队列底层的数据结构堆(heap)会随时调整结构,使得每次的队首元素都是优先级最高的,话不多说让我们一起来了解一下吧。 2.priority_queue 的定义 要使用优先队列,应先添加头文件 #include<queue> ,并在头文件下面加上“using namespace std;”。 其定义..
priority_queue(堆)干货归纳+用法示例
lzq8090的博客
03-30 1143
在C++中,堆(Heap)是一种特殊的树状数据结构,其中每个节点都比其子节点大或小(具体取决于堆的类型)。堆通常用于实现优先队列和排序算法
写文章

热门文章

  • sqrt()函数的详解和用法 309023
  • sort()函数详解 74237
  • 解决浏览器不能打开摄像头问题 55255
  • 无线网卡WLAN驱动无法启动(错误代码10)拯救指南 46452
  • 单片机蜂鸣器代码 41696

分类专栏

  • 研究生
  • 软件安装 4篇
  • 深度学习 7篇
  • 知识点 3篇
  • 编程相关 4篇
  • 论文阅读
  • 前端入门 1篇
  • HTML入门 15篇
  • CSS入门 6篇
  • JS入门
  • ACM之旅 52篇
  • 算法进阶指南 43篇
  • ACM常见的问题 4篇
  • 每日一题之div1A 10篇
  • 每日一套Div2 8篇
  • 每日一套Div3 10篇
  • 算法 56篇
  • 编程比赛总结 31篇
  • 算法模板 16篇
  • 洛谷题单习题 7篇
  • 牛客小白赛 34篇
  • Acwing课程
  • Acwing算法基础 6篇
  • Acwing算法提高 6篇
  • Acwing蓝桥杯 11篇
  • Acwing比赛 75篇
  • Acwing每日一题 39篇
  • AC Saber 7篇
  • 主流的算法题单
  • PAT甲级真题解析 155篇
  • PAT乙级真题解析 98篇
  • 牛客算法入门题单 8篇
  • 牛客语法入门题单 7篇
  • 挑战程序设计竞赛(二)题单 4篇
  • 蓝桥杯 3篇
  • USACO Training题单 23篇
  • 考研408
  • 操作系统考研 70篇
  • 计算机网络考研 69篇
  • 计算机组成原理考研 7篇
  • 数据结构考研 9篇
  • C/C++
  • C语言 45篇
  • C++入门 24篇
  • C语言(科普和问题解答) 50篇
  • C语言游戏开发 38篇
  • Qt入门 3篇
  • 数据库 36篇
  • Linux 36篇
  • 网络安全 23篇
  • 单片机 13篇
  • Matlab 13篇
  • 其他 31篇
  • 乱七八糟 27篇

最新评论

  • C语言常用的数学函数

    2301_80108279: 等于lg16/lg3,然后就可以表示了

  • 如何用c语言插入(背景)音乐

    Word麻鸭️: 我想问一下为什么最后报错啊,显示“未定义的应用‘_imp_PlaysoundA’”

  • 用MATLAB计算矩阵和行列式

    CT特: 是用一个很小的数代替0

  • 2021 RoboCom 世界机器人开发者大赛-本科组(初赛)【完结】

    小昂洋白菜: oj赛制还是oa赛制啊

  • 如何用c语言插入(背景)音乐

    Ting-G: 您好,您的问题是怎么解决的?

大家在看

  • Java | Leetcode Java题解之第503题下一个更大元素II
  • 基于SSM的搬家预约系统(有报告)。Javaee项目。ssm项目。 350
  • 工作日志:elementplus表演验证和提交 17
  • 排序(二)快速排序的多种实现方法 115
  • 【数据结构与算法】《红黑树的奥秘:自平衡之道》 396

最新文章

  • 【深度学习项目从下载到运行】
  • 图形处理笔记
  • 深度学习入门:基于Python的理论与实现【笔记】
2023年31篇
2022年265篇
2021年565篇
2020年412篇

目录

目录

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家蒙自市玻璃钢雕塑设计公司广东步行街玻璃钢雕塑供应商成都玻璃钢雕塑摆件销售厂家玻璃钢雕塑的优劣性赤峰玻璃钢卡通雕塑海王玻璃钢雕塑玻璃钢仿铜红军雕塑玻璃钢民俗雕塑设计费用广东商场美陈哪里有玻璃钢雕塑油漆宁波多彩玻璃钢雕塑销售厂家汉白玉雕塑和玻璃钢雕塑的区别玻璃钢雕塑熊图片云南百货商场美陈贵安新区玻璃钢雕塑厂有哪些苏州动物玻璃钢雕塑设计温江玻璃钢卡通雕塑仿古玻璃钢雕塑定制玻璃钢雕塑的照片河北艺术商场美陈多少钱商场美陈气球方案2个颜色黄浦区玻璃钢雕塑厂嘉峪关玻璃钢雕塑生产厂家湖北特色玻璃钢雕塑江西玻璃钢雕塑定做玻璃钢动植物雕塑上海街道宣传玻璃钢雕塑黔东南商场美陈布展杭州商场美陈供应商涧西玻璃钢雕塑费用香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化