引用
引用需要加上头文件queue而不是priority_queue!
#include <iostream>
#include <queue>
using namespace std;
int main(){
priority_queue<int> q;
}
基本操作
priority_queue是优先级序列,其底层是通过堆(heap)来实现的,即我们关注的点在于堆顶的元素。使用priority_queue没有返回尾部元素的函数(说堆尾也太奇怪了),只有一个top返回堆顶元素。push,size,empty都是queue类型的数据结构通有的函数。
改变优先级
priority_queue的优先级改变有些奇怪,跟sort函数的cmp函数相同但又不完全相同。它们俩的使用方法基本一致,但是priority_queue的结果跟sort是反过来的。
改变它的优先级有两种方法,第一种是通过结构体来改变,通过引入友元friend来重载(operator)小于号
#include <bits/stdc++.h>
using namespace std;
struct fruit {
string name;
int price;
friend bool operator < (fruit f1, fruit f2) { //对于比较两个结构体的小于号进行重载
return f1.price < f2.price; //对小于号进行重载
}
} f1, f2, f3;
int main() {
priority_queue<fruit> q;
f1.name = "桃子";
f1.price = 3;
f2.name = "梨子";
f2.price = 4;
f3.name = "苹果";
f3.price = 1;
q.push(f1);
q.push(f2);
q.push(f3);
cout << q.top().name << " " << q.top().price;//梨子 4 与sort函数是反过来的
}
第二种
同样利用的是struct,但是此时注意struct cmp的书写与友元书写有些不同。友元书写方式在operator后面是有一个小于号的,但是第二种方法是用括号取而代之。
#include <bits/stdc++.h>
using namespace std;
struct fruit {
string name;
int price;
} f1, f2, f3;
struct cmp {
bool operator()(fruit f1, fruit f2) {
return f1.price < f2.price;
}
};
int main() {
priority_queue<fruit, vector<fruit>, cmp> q; //vector是承载底层数据结构堆的容器 cmp为比较函数
f1.name = "桃子";
f1.price = 3;
f2.name = "梨子";
f2.price = 4;
f3.name = "苹果";
f3.price = 1;
q.push(f1);
q.push(f2);
q.push(f3);
cout << q.top().name << " " << q.top().price;
}
注意!! priority_queue的排序跟sort是反过来的!!!
如果priority_queue装载的是int,那么可以用比较器greater与less来直接排。比较器用法如下
对于数组的基本用法
#include <bits/stdc++.h>
using namespace std;
int main() {
int arr[] = {92, 0, 9, 2, 3313, 412};
sort(arr, arr + 6, less<int>());
for (int i = 0; i < 6; ++i) {
cout << arr[i] << " ";
}
cout << endl;
sort(arr, arr + 6, greater<int>());
for (int i = 0; i < 6; ++i) {
cout << arr[i] << " ";
}
}
优先队列
#include <bits/stdc++.h>
using namespace std;
int main() {
priority_queue<int, vector<int>, less<int> > q; //注意要加空格 >>是右移运算符
q.push(4);
q.push(0);
q.push(5);
cout << q.top();//5
}
由此可直观看出sort与priority_queue的区别,的确是反过来的。