priority_queue
常规用法
priority_queue底层是用堆来实现的,因此可以把它看成一个堆。默认是值大的优先级高。
#include <iostream>
#include <queue>
using namespace std;
int main(){
priority_queue<int> q;
q.push(4);
q.push(8);
q.push(2);
cout << q.top() << endl;
return 0;
}
输出结果为 8
我们可以改变优先级,要在优先队列的定义中添加参数:
priority_queue<int, vector<int>, greater<int>> q;
q.push(4);
q.push(8);
q.push(2);
cout << q.top() << endl;
输出结果为 2
priority_queue<int, vector<int>, greater<int>> q
第一个参数表示队列的数据类型,第二个参数表示承载底层数据结构“堆”的容器,第三个参数greater<int>
表示数字小的优先级高,若是less<int>
则表示数字大的优先级高。
结构体用法
如果队列中的数据类型是复杂的结构体,那么需要进行运算符重载。
#include <iostream>
#include <queue>
using namespace std;
struct fruit {
string name;
double price;
friend bool operator < (fruit a, fruit b) { //友元函数
return a.price > b.price;
}
};
int main() {
priority_queue<fruit>q;
for (int i = 0; i < 5; i++) {
fruit tmp;
cin >> tmp.name >> tmp.price;
q.push(tmp);
}
cout << q.top().name << ": " << q.top().price << endl;
return 0;
}
输入:
苹果 3.54
鸭梨 4.53
樱桃 9.78
猕猴桃 7.69
香蕉 2.35
输出结果为:香蕉 2.34
代码中的友元函数用来重载运算符<,相当于告诉优先队列,你以为的大值就是price的小值。所以优先队列按price从小到大排列。
在结构体中重载了运算符,优先队列的定义中就不需要第二个、第三个参数。
也可以把友元函数从结构体中拿出来,此时需要在优先队列的定义中添加第二个、第三个参数:
#include <iostream>
#include <queue>
using namespace std;
struct fruit {
string name;
double price;
};
struct cmp { //单独拿出来运算符重载的部分
bool operator () (const fruit& a, const fruit& b) { //为了避免结构体中数据庞大,最好使用引用来提高效率,需要加上const和&
return a.price > b.price;
}
};
int main() {
priority_queue<fruit, vector<fruit>, cmp>q;
for (int i = 0; i < 5; i++) {
fruit tmp;
cin >> tmp.name >> tmp.price;
q.push(tmp);
}
cout << q.top().name << ": " << q.top().price << endl;
return 0;
}
输入:
苹果 3.54
鸭梨 4.53
樱桃 9.78
猕猴桃 7.69
香蕉 2.35
输出结果为:香蕉 2.34