- 優先隊列底層是靠堆實現的,是一種特殊的隊列。
- 優先隊列的隊首元素一定是當前隊列中優先級最高的那個,也就是說,如果把優先隊列中元素依次出隊,會得到按優先級從大到小排列的一組元素
- 向優先隊列中插入元素時,優先隊列內部的堆結構會自動調整,保證隊首元素永遠是優先級最高的。
- priority_queue定義於
queue.h
,命名空間std
一、構造函數
作用 |
代碼 |
說明 |
定義一個priority_queue |
priority_queue<typename> pq; |
typename可以是任意基礎數據類型或STL容器 |
二、訪問priority_queue內元素
- 與queue不同,priority_queue沒有
front()
和back()
方法,只能通過top()
方法訪問隊元素
#include <iostream>
#include <queue>
using namespace std;
int main()
{
priority_queue<int> pq;
pq.push(1);
pq.push(2);
pq.push(3);
pq.push(4);
cout<<pq.top()<<endl;
pq.pop();
cout<<pq.top()<<endl;
return 0;
}
三、常用操作
(1)基本操作
操作 |
代碼 |
時間複雜度 |
說明 |
元素x入隊 |
pq.push(x) |
O(logN),N爲當前優先隊列中元素個數 |
- |
隊首出隊 |
pq.pop() |
O(logN),N爲當前優先隊列中元素個數 |
出隊的是優先級最高的元素 |
隊列判空 |
pq.empty() |
O(1) |
返回一個bool類型 |
訪問隊首元素(不影響隊列) |
pq.top() |
O(1) |
如果隊列爲空,top()方法會報錯 |
獲得priority_queue內元素個數 |
pq.size() |
O(1) |
- |
(2)設置優先級
1. 基本數據類型的優先級
- 僅適用於基本數據類型
- 對於int、double等類型,數字越大優先級越高
- 對於char,字典序越大優先級越高
- 對於基本數據類型,
priority_queue<int> q;
等價於priority_queue<int, vector<int>, less<int>> q
- 其中第二個參數
vector
是用來承載底層的堆結構的,這裏出現的3個typename應該相同
- 第三個參數
less
是對第一個參數的比較類,less<typename>
代表數字大的優先級高;greater<typename>
代表數字小的優先級高
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
int main()
{
priority_queue<int,vector<int>,greater<int> > pq;
pq.push(1);
pq.push(2);
pq.push(3);
pq.push(4);
cout<<pq.top()<<endl;
pq.pop();
cout<<pq.top()<<endl;
return 0;
}
2. 結構體優先級設置
- 適用於基本數據類型、結構體和STL容器
- 下面定義一個fruit結構體,希望價格高的結構體優先級高
struct fruit
{
string name;
int price;
friend bool opreator < (fruit f1,fruit f2)
{
return f1.price < f2.price;
}
};
priority_queue<fruit> q;
struct fruit
{
string name;
int price;
};
struct cmp
{
bool opreator () (fruit f1,fruit f2)
{
return f1.price < f2.price;
}
};
priority_queue<fruit,vector<fruit>,cmp> q;
- 如果結構體內數據較大,可以在重載運算符時使用常引用來提高效率
friend bool opreator < (const fruit &f1,const fruit &f2)
{
return f1.price < f2.price;
}
bool opreator () (const fruit &f1,const fruit &f2)
{
return f1.price < f2.price;
}