基本概念:
优先级队列是一种常见的数据结构,在《STL源码剖析中》给出的定义是:priorty_queue是一个带权值观念的队列。
也就是说:优先级队列中的元素不是按照入队的顺序进行排列,而是自动依照元素的权值排列,权值最高者排在前面。
缺省情况下维护的是一个大堆,即权值从高到低排列。
优先级队列的基本操作(和一般队列一致):
q.size();//返回q里元素个数
q.empty();//返回q是否为空,空则返回1,否则返回0
q.push(k);//在q的末尾插入k
q.pop();//删掉q的第一个元素
q.top();//返回q的第一个元素
基本使用
1.优先级判断默认使用<操作符,输出按权值从高到低顺序
int main()
{
priority_queue<int> p1;//往队列里直接存入整型
p1.push(5);
p1.push(4);
p1.push(6);
p1.push(3);
p1.push(1);
for (int i = 0; !p1.empty(); ++i)
{
cout << p1.top() << " ";
p1.pop();
}
return 0;
}
//输出:6 5 4 3 1
2.权值从低到高的顺序输出(greater优先队列)
priority_queue<int, vector<int>, greater<int> > q
第一个参数为元素的类型,第二个参数为容器类型,第三个参数为比较函数(默认为less),上面的为从小到大的优先级队列,如果将greater改为less或者删去第三个参数,即为权值从大到小排列。注意greater包含在头文件functional内。
对应的还有less 优先队列
priority_queue<int,vector<int>,less<int> >q;
这其实就和一开始的优先队列一样了,也是从权值大的开始输出
3.对结构体进行操作
有时候我们想要往队列里存储结构体,为了实现和内置类型一样的优先级比较,我们就必须在结构体中实现对“<”
的重载。因为优先级队列在内部实现调整的时候会去找“<”
操作符,如果找不到就会报错。
#include<queue>
using namespace std;
struct node{
char s[15];
int rank;
friend bool operator < (node a,node b ){
return a.rank>b.rank;
}
};
priority_queue<node>q;
自己写一个优先级队列::
总结学习1:https://blog.csdn.net/LF_2016/article/details/52750174
总结学习2:https://blog.csdn.net/red_red_red/article/details/84559951
总结学习3:https://blog.csdn.net/char_m/article/details/105840872?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_baidulandingword-0&spm=1001.2101.3001.4242