何为优先队列?
在回答这个问题之前,先想一想只是简单的队列是不是用处好像不大,或者说并不是非常方便,所以能不能有一种方式,让元素进入队列的时候就有序了呢。
这个问题当然被很多先驱考虑过,这也就出现了优先队列
这里介绍一些结构
1:默认结构
定义:
priority_queue<int>que;//que是优先队列的名称。
优先级:值越大,越优先。
队列结果:《头》》降序》《尾》
2:greater结构
定义:
priority_queue<int,vector<int>,greater<int> >que;//que是优先队列的名称。这里最后的>>要隔开,不然容易误判成io输入中的>>;
优先级:值越小,越优先。
队列结果:《头》》升序》《尾》
3:less结构
定义:
priority_queue<int,vector<int>,less<int> >que;//que是优先队列的名称。这里最后的>>要隔开,不然容易误判成io输入中的>>;
优先级:值越大,越优先。
队列结果:《头》》降序》《尾》
4:自定义结构——结构体1
定义:
struct cmp1{
bool operator()(int &a,int &b){
return a>b;//这里的意思是如果条件成立返回1,而1在优先队列里会使b的优先值大,否则a大,,最后表现为升序
}
};//自定义最大的有点就是可以加入多个判断条件,这里当然只是列举了最简单的一种
int main()
{
priority_queue<int,vector<int>,cmp1>que;//这里que是优先队列的名称
}
5:自定义结构——结构体2(同时定义数据类型)
定义:
struct cmp1{
int n;//数据类型在结构体里直接定义
bool operator < (const cmp1 &a) const {
return n>a.n;//这里的意思是如果条件成立返回1,而1在优先队列里会使后者(这里的a是新读入的cmp1变量)的优先值大,否则前者大,,最后表现为升序
}
};//这里同样可以加入多个判断条件,这里当然也只是列举了最简单的一种
int main()
{
priority_queue<cmp1>que;//这里que是优先队列的名称
}
值得注意的是在这种模式下cout输出top是不稳定的(哪怕只有一个值),非常容易出错(反正我每次都报错),输出的话尽量先转化,如果只有一个值,也可用基本输入输出中的printf函数。