标准::p riority_queue 的自定义比较器背后的逻辑

Logic behind the custom comparator for std::priority_queue

本文关键字:比较器 背后 自定义 queue riority 标准      更新时间:2023-10-16

>我正在尝试为以下优先级队列编写自定义比较器:

priority_queue<pair<int,int>,vector<pair<int,int>>,cmp> pq;

对中的第一个int是密钥,第二个int是密钥的计数。我希望我的优先级队列将计数最大的对放在顶部。

以下是满足我需求的函子:

class cmp{
public:
bool operator()(const pair<int,int> a, const pair<int,int> b)const{
return a.second < b.second;
}
};

我不太明白为什么这是正确的方法。 为什么比较器返回a.second < b.second而不是a.second > b.second,因为我想把计数最多的货币对放在顶部? 优先级队列将如何实际利用这个比较器?

来自std::priority_queue的文档:

请注意,Compare参数的定义是,如果它的第一个参数以弱顺序出现在第二个参数之前,它将返回true。但是,由于优先级队列首先输出最大的元素,因此"之前"的元素实际上是最后输出的。

同样的情况也发生在std::make_heap():提供一个返回a < b的比较器——std::less做什么——会导致这个函数模板构建一个max-heap,即具有最高键的元素位于堆的顶部。如果要构建最小堆,则必须传递operator>而不是operator<,或者仍然使用operator<但翻转操作数。

总而言之,std::priority_queue和用于处理二进制堆的函数模板都对其元素进行排序,以便顶部对应于具有最高键的元素。但是,两个键之间的比较取决于您。您可以通过提供自定义比较器来控制这一点。