一、引言
- 隊列的特性是
先進先出
。 - 優先級隊列的本質是一個
有序
隊列,根據成員的優先級,對隊列中的成員進行排序。 - 優先級隊列默認是
大頂堆
,即堆頂元素最大
二、常用函數
- empty()
- size()
- top()
- push()
- emplace()
- pop()
- swap()
三、代碼示例
class SS {public:SS(int _val = 0) : val(_val) {}bool operator<(const SS& ss) const { return val < ss.val; } // 聲明 pq1 的基礎bool operator>(const SS& ss) const { return val > ss.val; } // 聲明 pq2 的基礎int val;
};struct SS_Compare {public:bool operator()(const SS& ss1, const SS& ss2) const { // 聲明 pq 的基礎return ss1.val < ss2.val;}
};int main() {priority_queue<SS, vector<SS>, SS_Compare> pq;priority_queue<SS, vector<SS>, less<SS>> pq1;priority_queue<SS, vector<SS>, greater<SS>> pq2;pq.push(SS(1));pq.push(SS(2));pq.push(SS(3));vector<SS> v;sort(v.begin(), v.end(), SS_Compare());while (!pq.empty()) {std::cout << pq.top().val << std::endl;pq.pop();}return 0;
}
四、自定義排序方法
在上述的代碼示例中,展示了三種使用自定義排序函數的方法:
- 使用
仿函數
- 重載
<
,然后使用less
- 重載
>
,然后使用greater
注意到,在使用仿函數的時候,我們給優先級隊列傳遞的是類型,而在sort()函數中使用仿函數的時候,我們傳遞的實參是臨時函數對象。
這個差異源于優先級隊列(priority_queue)和排序算法(sort)在C++中不同的設計方式。
那為什么要這么設計呢???
- 優先級隊列: 需要存儲比較器作為成員變量,因此需要在構造時知道類型
- 排序算法: 是一次性操作,可以直接接受一個比較器對象
這種設計差異是C++標準庫的歷史和實用性的結果,反映了不同容器和算法的使用模式。
五、容器
優先級隊列使用的默認容器是vector
,也可以選用deque
或者自定義容器類型。
但自定義容器類型必須滿足一些要求才能被優先級隊列接受。
此外,默認容器vector
已經足夠高效,所以通常不建議使用自定義容器。