今天花了一个小时理顺了优先队列的基本操作 。
#include<bits/stdc++.h>
using namespace std;
struct fruit{
string name;
int price;
friend bool operator < (const fruit &f1,const fruit &f2){
// return f1.price < f2.price;
return f1.price > f2.price;
//重载<运算,使得比较f1,f2实际上比较他们的价格
}; //注意:只能重载'<' 其他比较关系都可通过它实现
//例如:f1>f2 等价于 f2<f1 ;f1==f2 等价于 !(f1<f2)&&!(f2<f1)
//若想改变优先关系,return f1.price > f2.price即可
//参数表中的const和&是为了提高效率,可以去掉以方便理解
int main(){
//优先队列的定义:
priority_queue<int> q1;
priority_queue<int,vector<int>,less<int> > q21;
priority_queue<int,vector<int>,greater<int> > q22;
//上面两种定义是等价的,第二种定义的三个参数分别为:
//int--数据类型;若为string则比较字典序
//vector<int>--用于承载堆的容器;
//less<int>--表示低优先级(大顶堆),从大到小
//把less换成greater,可把队列优先级换成从小到大
//要注意,最后的'> >'必须要用空格隔开,否则会被当成位移运算符
//优先队列借助堆实现,所以访问只能用q.top(),
//其他操作队列相同,包括:pop(),push(),empty(),size()
//自定义优先级,除了上面用到的greater代替less
//要实现更加灵活的比较,就用到最开始定义的结构体
//test:自己把参数名改一下运行即可,要改三个地方别漏了
// for(int i=0;i<3;i++){
// q1.push(i);
// }
// for(int i=0;i<3;i++){
// printf("%d ",q1.top());
// q1.pop();
// }
priority_queue<fruit> q3;
priority_queue<fruit,vector<fruit>,less<fruit> > q4;
//因为只能重构<,所以在函数里修改了return表达式,很僵硬。不需要改变less
for(int i=0;i<3;i++){
fruit f;
//fruit f = new fruit();报错,求指教
f.name = "haunghe";
f.price = i;
q4.push(f);
//delete f;
}
for(int i=0;i<3;i++){
printf(" %s :%d",q4.top().name.c_str(),q4.top().price);
q4.pop();//注意printf输出string类型,需要转换
}
}