priority_queue
priority_queue 優先隊列,其底層是用堆來實現的。在優先隊列中,隊首元素一定是當前隊列中優先級最高的那一個。
在優先隊列中,沒有 front() 函數與 back() 函數,而只能通過 top() 函數來訪問隊首元素(也可稱爲堆頂元素),也就是優先級最高的元素。
一、基本數據類型的優先級設置
此處指的基本數據類型就是 int 型,double 型,char 型等可以直接使用的數據類型,優先隊列對他們的優先級設置一般是數字大的優先級高,因此隊首元素就是優先隊列內元素最大的那個(如果是 char 型,則是字典序最大的)。
//下面兩種優先隊列的定義是等價的
priority_queue<int> q;
priority_queue<int,vector<int>,less<int> >;//後面有一個空格
1
2
3
4
5
其中第二個參數( vector ),是來承載底層數據結構堆的容器,第三個參數( less ),則是一個比較類,less 表示數字大的優先級高,而 greater 表示數字小的優先級高。
如果想讓優先隊列總是把最小的元素放在隊首,只需進行如下的定義:
priority_queue<int,vector<int>,greater<int> >q;
1
2
3
示例代碼:
void test1(){
//默認情況下,數值大的在隊首位置(降序)
priority_queue<int> q;
for(int i = 0;i <= 10;i ++)
q.push(i);
while(!q.empty()){
cout<<q.top()<<" ";
q.pop();
}
cout<<endl;
//greater<int>表示數值小的優先級越大
priority_queue<int,vector<int>,greater<int> > Q;
for(int i = 0;i <= 10;i ++)
Q.push(i);
while(!Q.empty()){
cout<<Q.top()<<" ";
Q.pop();
}
}
二、結構體的優先級設置
1.方式一:重載運算符 ‘<’
可以在結構體內部重載 ‘<’,改變小於號的功能(例如把他重載爲大於號)
struct student{
int grade;
string name;
//重載運算符,grade 值高的優先級大
friend operator < (student s1,student s2){
return s1.grade < s2.grade;
}
};
1
2
3
4
5
6
7
8
9
10
11
示例代碼:
void test2(){
priority_queue<student> q;
student s1,s2,s3;
s1.grade = 90;
s1.name = "Tom";
s2.grade = 80;
s2.name = "Jerry";
s3.grade = 100;
s3.name = "Kevin";
q.push(s1);
q.push(s2);
q.push(s3);
while(!q.empty()){
cout<<q.top().name<<":"<<q.top().grade<<endl;
q.pop();
}
}
/*
結果:
Kevin:100
Tom:90
Jerry:80
*/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
2.方式二:把重載的函數寫在結構體外面
將比較函數寫在結構體外面,作爲參數傳給優先隊列。
struct fruit{
string name;
int price;
};
struct cmp{
// "<" 表示 price 大的優先級高
bool operator() (fruit f1,fruit f2){
return f1.price < f2.price;
}
};
1
2
3
4
5
6
7
8
9
10
11
12
示例代碼:
void test3(){
priority_queue<fruit,vector<fruit>,cmp> q;
fruit f1,f2,f3;
f1.name = "apple";
f1.price = 5;
f2.name = "banana";
f2.price = 6;
f3.name = "pear";
f3.price = 7;
q.push(f1);
q.push(f2);
q.push(f3);
while(!q.empty()){
cout<<q.top().name<<":"<<q.top().price<<endl;
q.pop();
}
}
/*
結果:
pear:7
banana:6
apple:5
*/