📅  最后修改于: 2023-12-03 15:25:54.390000             🧑  作者: Mango
优先级队列是一种基于堆的数据结构,支持插入和提取最小/最大元素的操作。在C++中,优先级队列通常使用标准库中的std::priority_queue
实现。但是,std::priority_queue
默认只按照第一个元素排序,这就限制了它的应用范围。在实际应用中,我们常常需要按照第二个元素排序,因此需要一种能够支持按照任意元素排序的优先级队列。
本文介绍一种使用C++实现按照第二个元素排序的优先级队列的方法。
使用std::pair
类型可以方便地存储两个元素。我们可以定义一个排序函数,使得它按照第二个元素排序,然后在定义优先级队列时指定排序函数即可。
#include <iostream>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std;
bool cmp(pair<int,int> a, pair<int,int> b) {
return a.second > b.second;
}
int main() {
vector<pair<int,int>> v {{1,10}, {2,5}, {3,8}, {4,2}, {5,6}};
priority_queue<pair<int,int>, vector<pair<int,int>>, decltype(&cmp)> pq(cmp);
for (auto x : v) {
pq.push(x);
}
while (!pq.empty()) {
cout << pq.top().first << " " << pq.top().second << endl;
pq.pop();
}
return 0;
}
输出结果为:
4 2
2 5
5 6
3 8
1 10
另一种实现方式是,定义一个结构体,重载operator<
使得它按照第二个元素排序,然后在定义优先级队列时指定该结构体即可。
#include <iostream>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std;
struct cmp {
bool operator()(pair<int,int> a, pair<int,int> b) {
return a.second > b.second;
}
};
int main() {
vector<pair<int,int>> v {{1,10}, {2,5}, {3,8}, {4,2}, {5,6}};
priority_queue<pair<int,int>, vector<pair<int,int>>, cmp> pq;
for (auto x : v) {
pq.push(x);
}
while (!pq.empty()) {
cout << pq.top().first << " " << pq.top().second << endl;
pq.pop();
}
return 0;
}
输出结果与上例相同。
这两种实现方式的本质相同,都是通过自定义排序规则来实现按照第二个元素排序。使用std::pair
类型和重载operator<
两种方式各有优缺点,应根据实际情况选择适合的方法。