如何直观地理解C++优先级队列容器比较器中的大于/小于运算符
How to intuitively understand larger than/less than operator in comparator of C++ priority queue container
我总是对定义优先级队列容器的比较器感到困惑,不知道如何理解它。例如,我有一个vector
为pair<int,int>
,其中我希望按其第二个字段值降序排列对。
所以代码看起来是这样的:
struct Compare
{
bool operator()(pair<int,int> const &p1, pair<int,int> const &p2) const
{
return p1.second < p2.second;
}
};
priority_queue<pair<int,int>,vector<pair<int,int> >, Compare> pqueue;
如何理解这里的运算符"<"
,因为我第一次认为它应该是">"
,必须根据结果进行更改。为什么它是按降序排列的"<"
而不是">"
?我只想在下次使用priority_queue
时第一次就把它做好。非常感谢。
Priority队列基于比较运算符返回top元素,这意味着当您逐个检索项目时,您可以按降序获取它们。
比较运算符的含义始终保持"小于">,这意味着当compare(A, B)
为真时,B
的优先级高于A
,并且会更早地从优先级队列返回。
反转比较函数会反转从优先级队列中获取项目的顺序。具体而言,使用>
代替<
将顺序反转为升序。
在某种程度上,你感到有点不安是正确的,因为我们可以将最高优先级与更高的值联系起来,这可能会违反直觉。
但在优先级队列中,通常假设优先级顺序是从最低值到最高值。也就是说,集合的最小元素具有最高优先级,依此类推
我认为这种"反转"的直观原因与这样一个事实有关,即许多贪婪算法将较低的成本优先于较高的成本,为了管理这一点,这些算法可以使用成本的优先级队列。
相关文章:
- 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++标准算法会更快吗?
- 如何直观地理解C++优先级队列容器比较器中的大于/小于运算符