priority_queue 優先隊列,隻可以通路隊首元素top(),隻可以pop()隊首元素,可以随意push元素。會自動按照優先級排序。對于基本資料類型,按照數值由小到大(從隊首到隊尾排序)
1.基本方法
#include<iostream>
#include<queue>
using namespace std;
void empty(priority_queue<int> q){
if(q.empty()){
cout<<"空\n";
}else{
cout<<"非空\n";
}
}
int main(){
priority_queue<int> q;
q.push(3);
q.push(4);
q.push(1);
//4 3 2
cout<<"隊首:"<<q.top()<<endl;
q.pop();//3 2
cout<<"隊首:"<<q.top()<<endl;
cout<<"長度:"<<q.size()<<endl;
q.pop();//2
cout<<"長度:"<<q.size()<<endl;
empty(q);
q.pop();//null
empty(q);
return 0;
}
2.設定優先級别
(1)基本資料類型
這兩種方式等價:(預設方式,less表示數字大的優先級大)
priority_queue<int> q;
priority_queue<int,vector<int>,less<int> > q; //優先隊列底層是堆,vector<int>就是承載底層的堆的 數字小的優先級大:
priority_queue<int,vector<int>,greater<int> > q;
#include<iostream>
#include<queue>
using namespace std;
int main(){
priority_queue<int,vector<int>,greater<int> > q;
q.push(3);
q.push(4);
q.push(1);
cout<<q.top()<<endl;
return 0;
}
3.結構體優先級設定(重載<運算符)
寫法1:
#include<iostream>
#include<queue>
using namespace std;
struct fruit{
string name;
int price;
fruit(string name,int price){
this->name=name;
this->price=price;
}
friend bool operator < (fruit f1,fruit f2){
return f1.price<f2.price;//大的優先級高 和sort() cmp相反
}
};
int main(){
priority_queue<fruit> q;
fruit f1=fruit("桃子",3);
fruit f2=fruit("梨子",4);
fruit f3=fruit("蘋果",1);
q.push(f1);
q.push(f2);
q.push(f3);
cout<<q.top().name<<" "<<q.top().price<<endl;
return 0;
}
寫法2:
#include<iostream>
#include<queue>
using namespace std;
struct fruit{
string name;
int price;
fruit(string name,int price){
this->name=name;
this->price=price;
}
};
struct cmp{
bool operator() (fruit f1,fruit f2){
return f1.price>f2.price;//小的優先級别高
}
};
int main(){ //指定cmp結構體為比較依據
priority_queue<fruit,vector<fruit>,cmp> q;
fruit f1=fruit("桃子",3);
fruit f2=fruit("梨子",4);
fruit f3=fruit("蘋果",1);
q.push(f1);
q.push(f2);
q.push(f3);
cout<<q.top().name<<" "<<q.top().price<<endl;
return 0;
}
4.應用
貪心
dijkstra算法優化