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)時,此時就可以實現升序排列,提高了代碼的可用行