📌  相关文章
📜  按第二个元素排序的优先级队列 - C++ (1)

📅  最后修改于: 2023-12-03 15:25:54.390000             🧑  作者: Mango

按第二个元素排序的优先级队列 - C++

介绍

优先级队列是一种基于堆的数据结构,支持插入和提取最小/最大元素的操作。在C++中,优先级队列通常使用标准库中的std::priority_queue实现。但是,std::priority_queue默认只按照第一个元素排序,这就限制了它的应用范围。在实际应用中,我们常常需要按照第二个元素排序,因此需要一种能够支持按照任意元素排序的优先级队列。

本文介绍一种使用C++实现按照第二个元素排序的优先级队列的方法。

实现
使用pair类型

使用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<

另一种实现方式是,定义一个结构体,重载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<两种方式各有优缺点,应根据实际情况选择适合的方法。