1. C++優先級隊列priority_queue的排序規則


1.寫在前面:

queue, stack, priority_queue 都是順序容器適配器,底層使用vector, deque,list實現。

stack所關聯的基礎容器vector或deque或 list

queue所關聯的基礎容器是list

prority_queue 所關聯的基礎容器是vector或deque

priority_queue<type, contain, compare> type是元素類型,contain是順序容器, compare是排序規則 

2.1 優先級隊列內的元素是簡單類型,如int

默認情況下,優先級隊列元素從大到小排列,類似最大堆, 隊頭是值最大的那個元素

int main ()
{
  int myints[]= {10,60,50,20};
  std::priority_queue<int> first;//構建一個空堆
  std::priority_queue<int> second (myints,myints+4);// 隊頭元素是60
}

2.2 

如何實現隊頭元素值最小呢?compare參數傳入greator

#include <functional> // std::greator
int main ()
{
  int myints[]= {10,60,50,20};
  std::priority_queue<int, std::vector<int>, std::greater<int> >
                            third (myints,myints+4);
}

3.1優先級隊列的元素類型是復合類型,如pair

默認情況下,排序規則是先按照pair的first的屬性降序排列,如果first相等,則按照second屬性降序排序

同理,傳入std::greator后,排序規則是先按照pair的first的屬性升序排列,如果first相等,則按照second屬性升序排列

3.2按照特定排序規則

昨天做題時,遇到這么個問題,首先統計一個字符串的中各個字符的出現次數,存儲在map中

接着把map中每個pair加到優先級隊列中,排序規則是按照字符出現的次數由大到小排列

// 自定義排序類
class
mycomparison { bool reverse; public: mycomparison(const bool& revparam=false) {reverse=revparam;} bool operator() (pair<char, int>& lhs, pair<char,int>&rhs) const { if (reverse) return (lhs.second > rhs.second); // 比較結果為true時,lhs的優先級小於rhs的優先級,rhs排在前面,即升序排列 else return (lhs.second < rhs.second);// 默認情況下,比較結果為true時,lhs的優先級小於rhs的優先級,rhs排在前}
};


class Solution { public: string reorganizeString(string S) {
  map<char, int> my_map;
int length = S.size();
for(int i = 0; i < length; i++) { my_map[S[i]]++; }// 統計字符個數
priority_queue<pair<char, int>,vector<pair<char,int>> ,mycomparison> max_heap; //建立優先級隊列,排序規則是按找pair的第二個元素降序排列
map<char, int>::iterator begin = my_map.begin();
for(begin; begin != my_map.end(); begin++) { max_heap.push(*(begin)); }
  ……
};

 

這段代碼中,對mycomparison類的書寫,核心在於重載()函數,如果函數返回值是true,則證明函數中第一個參數的優先級比第二個參數小,優先級小的就該放到后面去

這段代碼還有個好處,當我傳入mycomparison(true)時,此時就可以實現升序排列,提高了代碼的可用行

 


免責聲明!

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



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