优先队列中的元素不同于一般先进先出的队列,被赋予了优先级,优先级队列具有最高级先出的行为特征,通常采用堆这种数据结构来实现。
基本操作如下:
priority_queue<node> pq;
pq.empty() //队列为空返回true,否则返回false
pq.size() //返回队列中元素的个数
pq.push() //在基于优先级的适当位置插入新元素
pq.pop() //删除队首元素,但不返回其值
pq.top() //返回具有最高优先级的元素值,但不删除该元素
C++优先队列默认是大顶堆,即队列的输出序列是从大到小。
1.最基本的less和greater
priority_queue<int, vector<int>, less<int>> pq; //从大到小
priority_queue<int, vector<int>, greater<int>> pq; //从小到大
2.重载
struct node{
int val;
bool operator <(const node &b) const{
return val > b.val;
}
};
struct node{
int val;
friend bool operator <(const node &a, const node &b){
return a.val > b.val;
}
};
struct node{
int val;
};
bool operator <(const node &a, const node &b){
return a.val > b.val;
}
上面三种方式都是按照数据从小到大的方式输出,我们可以这样理解:在比较node a和node b的时候,是通过小于的方式来进行的,即a < b是true or false,通过上面的三种方式,我们定义a.val > b.val的时候a < b,即a < b返回true,那么就认为b的优先级更高,默认是优先级更高的在前面,即b(val较小)会被先输出,实现了从小到大排序。
参考:https://blog.csdn.net/riba2534/article/details/53450085
此外,下面这种方式也可以实现重载:
struct cmp
{
bool operator()(const node &a, const node &b){
return a.val > b.val;
}
};
priority_queue<node, vector<node>, cmp> pq;