我总是对为优先级队列容器定义比较器感到困惑,并且不知道如何理解它。
例如,我有一个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
时第一次拍摄时才能正确使用。谢谢。
答案 0 :(得分:5)
优先级队列根据比较运算符返回 top 元素,这意味着当您逐个检索项目时,可以按降序顺序获取它们。
比较运算符的含义始终“小于”,这意味着当compare(A, B)
为真时,B
的优先级高于A
,并且将从优先级队列中提前返回。
反转比较功能会反转从优先级队列中获取项目的顺序。具体而言,使用>
代替<
会将订单转换为升序。
答案 1 :(得分:0)
在某种程度上,你感到有点不安是正确的,因为我们可以将最优先考虑的问题与较高的价值相关联,这可能是违反直觉的。
但是在优先级队列中,通常假设优先级顺序是从最低值到最高值。也就是说,集合的最小元素具有最高优先级,依此类推。
我认为这种“反转”的直观原因与许多贪婪算法优先考虑较低成本的优先级有关,为了对其进行管理,这些算法可以使用成本优先级队列。