一、关于priority_queue
1.本质:内部根据用户定义的权重自动排序的队列。
2.常用:顺序问题、哈夫曼问题等,此类问题其实都可用其他的方法来实现,但有可能其他的方法规模太大,在OJ时会超时。
二、使用priority_queue
1.引用
与queue的引用一致。
2.基本操作
push(x)将 x 入队,top()访问优先级最高的一个元素,pop()优先级最高的一个出队,empty()检测是否为空,size()返回队列内的元素个数。
3.优先级的设置(重要)
3.1 基本数据类型的优先级设置
对于int,char,double等基本数据类型,优先队列的默认是值(字典序)最大的在最前面,区别于 set 的最小值在前面,如果想把之最小的元素放在队首,则需要用以下定义:
priority_queue<typrname, vector<typename>, greater<typename> > q; //typename为int等基本数据类型。
3.2 对结构体的优先级设置
对于结构体的优先级设置需要重载小于号,见下例。
#include<stdio.h>
#include<queue>
#include<iostream>
#include<string>
using namespace std;
struct fruit{
int price;
string name;
// 价格不相等时价格由高到低,价格相等时名字由低到高。
// 与 sort 中 cmp 函数相反。
// 只允许对 < 进行重载。
friend bool operator < (fruit f1,fruit f2){
if(f1.price != f2.price){
return f1.price < f2.price;
}else{
return f1.name > f2.name;
}
}
};
int main(){
priority_queue<fruit> q;
fruit f[3];
f[0].price = 5;
f[0].name = "apple";
q.push(f[0]);
f[1].price = 5;
f[1].name = "banana";
q.push(f[1]);
f[2].price = 3;
f[2].name = "orange";
q.push(f[2]);
cout << q.top().name << " " << q.top().price << "\n";
q.pop();
cout << q.top().name << " " << q.top().price << "\n";
q.pop();
cout << q.top().name << " " << q.top().price << "\n";
return 0;
}
/*
output:
apple 5
banana 5
orange 3
*/