priority_queue是一个优先队列,优先级高的最先出队,默认最大值优先。内部实现为堆,因此出队和入队的时间复杂度均为O(logn)。可以自定义优先级控制出队顺序优先队列不支持删除堆中指定元素,只可以删除堆顶。需要引入头文件#include<queue>。
成员函数:
push(x):入队;
pop():出队;(把优先级最高的出队!)
top():取队头元素;
size():返回队中元素个数;
empty():判队空,若为空返回true;
priority_queue<int, vector<int> , cmp >que;
其中,第一个参数为数据类型,第二个参数为容器类型,第三个参数为比较函数。后两个参数根据需要也可以省略。
优先队列最常用的用法:priority_queue<int> que;//参数为数据类型,默认优先级(最大值优先)
有4种方法可以实现优先级控制:
1.使用C++自带的库函数<functional>。
2.有3种自定义优先级的方式。
一.使用C++自带的库函数<functional>,引用#include<functional>
equal_to<Type>//等于,Type为数据类型
not_equal_to<Type>//不等于
greater<Type>//大于
greater_equal<Type>//大于等于
less<Type>//小于
less_equal<Type>//小于等于
例:priority_queue<int,vector<int>, less<int> >que1;//最大值优先
注意“>>”会被认为错误,“>>”是右移运算符,注意用空格隔开。
priority_queue<int,vector<int>,greater<int> >que2;//最小值优先
二.
1.队列元素为数值型
struct cmpl { bool operator ()(int &a,int &b)//自定义操作符 { return a<b;//最大值优先,a>b表示最小值优先 } };
创建优先队列:priority_queue<int,vector<int>,cmpl>que3,//最大值优先
2.队列元素为结构体型,运算符重载写在结构体内,参数只需要一个。
struct node1 { int x,y;//结构体中的成员 bool operator<(const node1 &a) const { return x<a.x; } };
注意这里有点不一样:上图中表示最大值优先,x>a.x;才表示最小值优先
创建优先队列:priority_queue<node1>que5;//使用时要把数据定义为node1类型
3.队列元素为结构体型,运算符重载写在结构体内外,参数需要两个。
struct node3 { int x,y;//结构体中的成员 }; bool operator <(const node3 &a, const node3 &b)//在结构体外面定义 { return a.x<b.x;//按成员x最大值优先 }
代码解释:重载<操作符,意思是如果a.x< b.x成立,那么结构体node3 a <node3 b成立。由于优先队列是按照从大到小排列,所以结构体b会排列到a之前,因为b.x是最大的,所以实现了按照x的从大到小排序
创建优先队列:priority_queue<node3>que7;//使用时要把数据定义为node3类型