優先隊列priority_queue的排序


默認排序(降序排序)

· 默認的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;

其中greaterlessstd實現的兩個仿函數
 

自定義比較方法

如果不想用greaterless,可以使用自定義的比較方法:

  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表達式本身傳進去。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM