标准::p riority_queue 的自定义比较器背后的逻辑
Logic behind the custom comparator for std::priority_queue
>我正在尝试为以下优先级队列编写自定义比较器:
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
和用于处理二进制堆的函数模板都对其元素进行排序,以便顶部对应于具有最高键的元素。但是,两个键之间的比较取决于您。您可以通过提供自定义比较器来控制这一点。
相关文章:
- std::设置自定义比较器
- C++中"std::sort"比较器的不同类型
- 将 std::set 与基于键的比较器一起使用
- 带自定义比较器的最小优先级队列
- 函数类作为比较器
- 优先级队列自定义比较器
- 什么是自定义比较器以及如何在 C++ 的排序函数中使用它?
- 没有默认构造函数作为模板参数的自定义比较器
- set_intersection使用自定义设置比较器
- 如何为集合 c++ 建立比较器
- C++复杂情况的比较器通过参数问题
- 对于BTreeMap和其他依赖于Ord的东西,是否有等效于C++比较器对象?
- 对没有比较器或λ函数的向量进行排序?
- "operator()"在重载运算符方法中是什么意思,在priority_queue(STL)中用作C++中的比较器?
- 用户定义的结构是否有默认C++比较器?
- C++设置了一个用于排序的比较器和另一个用于唯一性的比较器
- 使用迭代器的自定义比较器函数
- C++对λ比较器EXC_BAD_ACCESS进行排序
- 如果要求比较器是严格的总排序,而不仅仅是严格的弱排序,C++标准算法会更快吗?
- Cython中带有自定义比较器的优先级队列