点击查看代码
#include<iostream>
#include<cstdio>
#include<queue>
#include<string>
#pragma warning(disable:4996)
using namespace std;
//建立一个结构体fruit存储水果名称和价格,结构体的优先级设置有两种
//(1)在结构体内部设置优先级,在main()中定义:priority_queue<fruit> q;
struct fruit {
string name;
int price;
//编写"<"重载友元函数,设置结构体的优先级(不能重载">")
friend bool operator< (fruit f1, fruit f2) {
//return f1.price < f2.price; //价格高的优先级高
return f1.price > f2.price; //价格低的优先级高
}
};
//(2) 在结构体外部设置优先级,在main()中定义:priority_queue<fruit1, vector<fruit1>, cmp> q1;
struct fruit1 {
string name;
int price;
};
struct cmp { //建立结构体cmp存储fruit1的优先级设置函数
//此时要编写重载函数,而不是"<"重载友元函数
bool operator() (fruit1 f1, fruit1 f2) {
//return f1.price < f2.price; //价格高的优先级高
return f1.price > f2.price; //价格低的优先级高
}
};
int main() {
/*
priority_queue<int> q;
q.push(3); //q按照默认优先级排序(数字大的优先级高)
q.push(4);
q.push(1); //q:4 3 1
printf("%d\n", q.top()); //q的队首元素是4
q.pop(); //令首元素4出队,即删除首元素4
printf("%d\n", q.top()); //q的队首元素是3
while (q.empty() == false) { //删除q中所有元素,empty()为true表示队列空
q.pop();
}
printf("%d\n", q.size()); //q中所有元素删除后,大小变为0
*/
/*
//优先级设置
//1、基础数据类型优先级设置
//第1个参数是存储元素类型,第2个参数是底层数据结构堆(heap)的容器类型
//第3个参数是优先级设置,greater<int>是元素值小的优先级高,less<int>是元素值大的优先级高(默认是less)
priority_queue<int, vector<int>, greater<int> > q;
q.push(3); //q按照元素值小的优先级高,q:1 3 4
q.push(4);
q.push(1);
printf("%d\n", q.top()); //q的队首元素是1
*/
//2、结构体类型的优先级设置
priority_queue<fruit> q; //在结构体fruit内部设置优先级
fruit f1, f2, f3; //3个fruit变量
f1.name = "桃子"; f1.price = 3;
f2.name = "梨子"; f2.price = 4;
f3.name = "苹果"; f3.price = 1;
//q按价格低的优先级高排序,所以q:苹果(1),桃子(3),梨子(4)
q.push(f1); q.push(f2); q.push(f3);
cout << q.top().name << " " << q.top().price << endl; //输出q的队首元素:苹果 1
priority_queue<fruit1, vector<fruit1>, cmp> q1; //在结构体fruit1外部设置优先级
fruit1 f4, f5, f6; //3个fruit1变量
f4.name = "桃子"; f4.price = 3;
f5.name = "梨子"; f5.price = 4;
f6.name = "苹果"; f6.price = 1;
//q1按价格低的优先级高排序,所以q1:苹果(1),桃子(3),梨子(4)
q1.push(f4); q1.push(f5); q1.push(f6);
cout << q1.top().name << " " << q1.top().price << endl; //输出q1的队首元素:苹果 1
return 0;
}