优先级队列未正确比较 C++
Posted
技术标签:
【中文标题】优先级队列未正确比较 C++【英文标题】:Priority Queue Not Comparing Correctly C++ 【发布时间】:2016-12-28 20:13:51 【问题描述】:我正在尝试创建一个由成对的 int、char 组成的优先级队列,它为我提供了具有更大 int 的对,但我的代码无法正常工作。我做错了什么?
这是我的比较器类:
class Compare
public:
bool operator() (pair<int, char>a, pair<int, char>b)
return a.first > b.first;
;
这是我的优先队列:
priority_queue<pair<int, char>, vector<pair<int, char>>, Compare> party;
但是如果我执行代码:
party.push(make_pair(2, 'A'));
party.push(make_pair(3, 'B'));
cout<<party.top().first;
它返回 2,而不是 3。如何修复优先队列的实现?
【问题讨论】:
【参考方案1】:Geordi La Forge 会使用相同的修复方法:反转极性:
bool operator() (const pair<int, char> &a, const pair<int, char> &b) const
return a.first < b.first;
比较函数总是实现严格的弱排序,也就是逻辑<
操作。但是priority_queue
,顾名思义,gives you the largest value in the priority queue, first:
... 提供最大(默认)元素的恒定时间查找,
但是比较函数还是严格的弱排序:
提供严格弱排序的比较类型。
有点反直觉,但过了一会儿,它确实有道理......
P.S.:比较函数应该是const
函数,并带const
参数,为了效率,如我的例子所示;但这是一个额外的细节。
【讨论】:
事实上,关于效率的部分是有争议的。如果函数是内联的(应该这样),那根本不重要。在无法想象的情况下,按值传递会提供更好的性能,至少在 86_64 上是这样。【参考方案2】:优先队列期望 Comparator 实现less
- 就像任何其他需要弱排序的容器一样。但是,它通过将较大的元素放在顶部来工作。由于您有效地实现了greater
,因此您颠倒了队列,现在最小的元素位于顶部。
要解决此问题,请将比较器更改为返回两个元素中较小的一个。
【讨论】:
以上是关于优先级队列未正确比较 C++的主要内容,如果未能解决你的问题,请参考以下文章