c++優先佇列(最大堆)的基本用法以及排序用法
阿新 • • 發佈:2021-01-23
c++的queue中有一種優先佇列 他會自動按要求遞增或者遞減排序
在寫一些演算法題的時候可以起到很好的輔助作用
今天給大家簡單介紹一下這些
優先佇列
既然是佇列那麼先要包含標頭檔案#include ,
他和queue不同的就在於我們可以自定義其中資料的優先順序, 讓優先順序高的排在佇列前面,優先出隊
優先佇列也具有普通佇列的所有的特性 比如size等等 其本質是用堆實現的 所以又稱為最大(小)堆
定義
priority_queue<Type,Container,Functional>
其中:
Type是資料型別
Container是容器型別(Container必須是用陣列實現的容器,比如vector等預設為vector
當我們不宣告任何的時候,預設是大頂堆
priority_queue<int, vector<int>, greater<int>> q;//升序
priority_queue<int, vector<int>, less<int>> q;//降序
//greater和less是std中實現的兩個仿函式
例子
int main() {
//auto cmp = [&](const auto& a, const auto& b) {
// return a.first + a.second < b.first + b.second;
//};
priority_queue<int, vector<int>, greater<int>> q1;//升序
priority_queue<int, vector<int>, less<int>> q2;//降序
//greater和less是std中實現的兩個仿函式
vector<int> nums = { 3,5,9,1,6,7,4 };
for (int i = 0; i < nums.size(); i++) {
q1.push(nums[i]);
q2.push(nums[i]);
}
while (!q1.empty()) {
cout << q1.top() << " ";
q1.pop();
}
cout << endl;
while (!q2.empty()) {
cout << q2.top() << " ";
q2.pop();
}
return 0;
}
我們可以觀察一下執行結果
可見最大最小的排序對於字母上邊沒有給出例子 但是升序降序和數字是一樣的
對於pair的排序
auto cmp = [&](const auto& a, const auto& b) {
return a.first < b.first ;
//first+second之和小的在後大的在前
};
vector < pair<int, int>> pairs;
for (int i = 0; i < 5; i++) {
pair<int, int> a;
a.first = i + 1;
a.second = 5 - i;
pairs.push_back(a);
}
cout << "排序前:" << endl;
for (auto pair:pairs) {
cout << pair.first << " " << pair.second << " | ";
}
priority_queue < pair<int, int>, vector<pair<int, int>>, decltype(cmp)> PairQueue(cmp);
//decltype是自動識別型別
for (auto pair : pairs) {
PairQueue.push(pair);
}
cout << endl;
cout << "排序後:" << endl;
while (!PairQueue.empty()) {
auto pair = PairQueue.top();
cout << pair.first << " " << pair.second << " | ";
PairQueue.pop();
}
return 0;
我們可以通過這種方式對於pair中任何想要的想要的結果設計cmp
這就是我所介紹的全部內容 希望對大家有幫助