其底层是用堆来进行实现的
在优先队列中,队首元素一定是当前队列中优先级最高的那一个
当然,可以在任何时候往优先队列里面加入push元素
而优先队列底层的数据结构堆(heap)会随时调整结构
使得每次的队首元素都是优先级最大的
1、定义
priority_queue<typename>name;
2、容器内元素的访问
和队列不一样的是,优先队列没有front()函数与back函数
只能通过top()函数来访问队首元素
(也可以称为堆顶元素)
也就是优先级最高的元素
3、常用函数
①push(x)
②top()
可以获得队首元素
③pop()
④empty()
⑤size()
4、容器内元素优先级的设置
①基本数据类型的优先级设置
优先级对它们的设置一般都是数字大的优先级越高
因此队首元素就是优先队列内元素最大的那个
(char就是字典序最大)
对于基本数据类型来说
下面两种优先队列的定义是等价的(以int型为例)
priority_queue<int>q;
priority_queue<int,vector<int> , less<int> >q;(把元素最小的元素放在队首)
vector<int>填写的是承载底层数据堆heap的容器
less<int>是对第一个参数(int)的比较类
【注意】
less<int>表示数字大的优先级越大
而greater<int>表示数字小的优先级越大
②结构体的优先级设置
重载是指对已有运算符进行重新定义
因为优先队列本身默认的规则就是优先级高的放在队首
因此把小于号重载为大于号就是把规则反向一下
【注意】
如果结构体内的数据较为庞大
(例如出现了字符串或者数组)
建议使用引用来提高效率
此时比较类的参数需要加上“const”和“&”
5、常见用途
可以解决一些贪心问题
也可以对dijksta算法进行优化
(因为优先队列的本质是堆)
知识点来自于《算法笔记》