C++优先级队列,传入pair后怎么实现自定义排序
时间: 2024-01-07 19:02:51 浏览: 141
优先级队列的C++实现
在 C++ 中使用 `std::priority_queue` 实现优先级队列时,可以传入一个比较函数作为第三个参数来实现自定义排序。如果要对 `pair` 进行排序,可以按照以下步骤进行:
1. 定义一个比较函数,比较函数的形式应该为 `bool cmp(const pair<int, int>& a, const pair<int, int>& b)`,其中 `pair<int, int>` 可以根据具体需求进行修改,比如 `pair<string, int>` 等。这个比较函数应该返回 `true` 或 `false`,表示 `a` 是否应该排在 `b` 前面。
2. 在定义 `priority_queue` 时,将比较函数作为第三个参数传入即可。比如 `priority_queue<pair<int, int>, vector<pair<int, int>>, decltype(cmp)> q(cmp);`,其中 `vector<pair<int, int>>` 表示底层容器使用的是 `vector`,`decltype(cmp)` 表示比较函数的类型。
下面是一个完整的例子,假设我们要将 `pair<int, int>` 按照第一个元素从小到大排序,如果第一个元素相等,则按照第二个元素从大到小排序:
```c++
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
bool cmp(const pair<int, int>& a, const pair<int, int>& b) {
if (a.first == b.first) {
return a.second > b.second;
}
return a.first < b.first;
}
int main() {
priority_queue<pair<int, int>, vector<pair<int, int>>, decltype(cmp)> q(cmp);
q.push(make_pair(1, 2));
q.push(make_pair(3, 4));
q.push(make_pair(1, 3));
q.push(make_pair(2, 1));
while (!q.empty()) {
pair<int, int> p = q.top();
cout << "(" << p.first << ", " << p.second << ")" << endl;
q.pop();
}
return 0;
}
```
输出结果为:
```
(1, 3)
(1, 2)
(2, 1)
(3, 4)
```
阅读全文