默認排序(降序排序)
· 默認的priority_queue采用降序排序
priority_queue<int>pq;
pq.push(3);
pq.push(1);
pq.push(2);
while(!pq.empty()) {
printf("%2d",pq.top());
pq.pop();
}
輸出 3 2 1
· priority_queue內類型為pair時,先比較pair.first
大小, pair.first
相等時比較pair.second
大小
priority_queue<pair<int,int>>pq;
pq.push({1,2});
pq.push({2,1});
pq.push({3,4});
pq.push({1,4});
while(!pq.empty()) {
printf("%d %d\n",pq.top().first,pq.top().second);
pq.pop();
}
輸出
3 4
2 1
1 4
1 2
升序排序
· 如果想要用升序排列怎么辦?先看一下優先隊列的定義
priority_queue<Type, Container, Functional>
其中Type 就是數據類型,Container 就是容器類型(Container必須是用數組實現的容器,比如vector,deque等等,但不能用 list。STL里面默認用的是vector),Functional 就是比較的方式,當需要用自定義的數據類型時才需要傳入這三個參數,使用基本數據類型時,只需要傳入數據類型,默認是大頂堆。
如果傳入的是int類型,我們可以用👇定義一個升序優先隊列
priority_queue <int,vector<int>,greater<int>> pq;
如果要定義一個降序優先隊列(等同於默認的不寫Container, Functional的方式),可以使用這種方法:
priority_queue <int,vector<int>,less<int>> pq;
其中greater
和less
是std
實現的兩個仿函數
自定義比較方法
如果不想用greater
和less
,可以使用自定義的比較方法:
auto comp = []( int a, int b ) { return a > b; };
priority_queue< int , vector<int>, decltype( comp )> pq( comp );
問題來了,為什么初始化pq
的時候還要傳comp
進去?
按照我們熟悉的sort
函數的經驗,sort
使用lambda表達式定制排序時,可以這樣寫:
sort (vec.begin(), vec.end(), [](int a, int b) {return a < b;});
比着葫蘆畫瓢,把priority_queue
寫成👇卻不行。
priority_queue< int , vector<int>, [](int a, int b) {return a < b;}> pq;
為什么會出現這種情況,這就需要看一下priority_queue
的構造函數:
explicit priority_queue( const Compare& compare = Compare(),
const Container& cont = Container() );
可以看到,如果我們構造時,不指定特定的compare
對象,那么就用typename Compare
的默認構造函數構造一個,然而lambda表達式的匿名類型是沒有默認構造函數的,
所以想要正確初始化這個優先隊列,還得在構造函數里再把lambda表達式本身傳進去。