详解在注释中,有需要可以复制到编译器查看:
#include <iostream>
#include <queue>
using namespace std;
//priority_queue 优先队列,根据优先级决定队首的元素,队首元素的优先级最高
//priority_queue<typename> name;
//priority_queue<int> q;
//q.top(); 优先队列只能访问队首元素(最高优先级)
//q.push(x); x入队
//q.empty(); 判空操作 true为空 false为非空
//q.size(); 判断队列中有几个元素
//难点:
//(1)基本数据优先级类型的设置 priority_queue<int , vector<int> , less<int>_> (最后>_>之间的_为空格,这个必不可少)
//vector<typename> 指的是用来承载底层数据结构堆的容器 less<typename>表示数字大的优先级越大 与 greater<typename>表示数字小的优先集越大
//(2)结构体优先级设置的两种方法
//第一种:在结构体中写入比较函数对<号进行重载,注意在函数前加入friend(友元)
//struct fruit{
// 这里以水果价格进行排序优先级
// string name;
// int price;
// friend bool operator < (fruit a,fruit b){
// return f1.price < f2.price; //<号是以价格高的优先级高,>号是以价格低的优先级高(与sort()函数的cmp正好相反)
// }f1,f2,f3;//需要几种写几个
//}
//主函数中定义:priority_queue<fruit> q;
//第二种:在结构体外定义比较函数
/*
struct fruit{
int price;
string name;
}f1,f2,f3;
struct cmp{
bool operator () (fruit a,fruit b){
return a.price>b.price;
}
};
主函数中的定义:priority_queue<fruit , vector<fruit>, cmp> q;
*/
//如果结构体中出现数据较为庞大(字符串、数组)建议使用引用来提高效率,加入const 和 &
//bool operator () (const fruit &a,const fruit &b)
//friend bool operator < (const fruit &a,const fruit &b)
struct fruit{
int price;
string name;
}f1,f2,f3;
struct cmp{
bool operator () (fruit a,fruit b){
return a.price>b.price;
}
};
int main()
{
priority_queue<fruit,vector<fruit>,cmp> q;
f1.name = "apple";
f1.price = 15;
f2.name = "peach";
f2.price = 12;
f3.name = "orange";
f3.price = 20;
q.push(f1);
q.push(f2);
q.push(f3);
cout<<"队首元素名:"<<q.top().name<<",元素价格:"<<q.top().price<<endl;
if(q.empty()!=true){
q.pop();
}
cout<<"出队一个元素后,队列的总长度:"<<q.size()<<"队首元素名是:"<<q.top().name<<endl;
return 0;
}