priority_queue的常見用法
priority_queue是什么?
- 優先隊列
- 底層實現用堆來實現
- 每次隊首的優先級最大
priority_queue的定義
引入頭文件
# include <queue>
using namespace std;
定義使用
priority_queue<typename> name;
容器內元素的訪問
只能通過top()函數來訪問隊首的元素
priority_queue<int> q;
q.push(4);
q.push(3);
q.push(2);
cout<<q.top()<<endl;//4
priority_queue常用函數解析
push()
使得元素x入隊,時間復雜度為o(logN)。
top()
獲取隊首的元素,時間復雜度為o(1)
pop()
pop()令隊首出隊,時間復雜度為o(logN)
empty()
檢測隊列是否為空,返回true,返回false
size()
返回隊列中的元素數量
priority_queue隊列優先級的設置
基本數據類型優先級的設置
對於基礎類型,一般是數字大的優先級高,對於字符,就是字典序越大,優先級越高。
priority_queue<int> q;
priority_queue<int,vector<int>,less<int>>;
兩種定義方式等價
- vector
是承載堆的容器 - less
是比較類,less 表示數字大優先級大,greater 表示數字大,優先級小
結構體優先級設置
重載小於號
例子
struct fruite{
string name;
string price;
};
價格高優先級高
設置友元函數,重載小於號<
struct fruite{
string name;
string price;
friend bool operator <(fruite a,fruite b){
return fruite.price<fruite.price;
}
};
注意
只能重載小於號
如果"重載>"
friend bool operator <(fruite a,fruite b){
return fruite.price>fruite.price;
}
創建比較結構體
struct fruite{
string name;
string price;
};
struct cmp{
bool operator() (fruite a,fruite b){
return a.price>b.price;
}
};
priority_queue<fruite,vector<fruite>,cmp> q;
priority_queue的用途以及注意點
- 解決貪心問題
- 注意在使用top()之前要判空使用empty()