我正在尝试创建一个由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.如何修复优先级队列的实现?
答案 0 :(得分:4)
Geordi La Forge将使用的相同修正:颠倒极性:
bool operator() (const pair<int, char> &a, const pair<int, char> &b) const
{
return a.first < b.first;
}
比较函数总是实现严格的弱排序,即a.k.a.逻辑<
操作。但是priority_queue
,根据定义,gives you the largest value in the priority queue, first:
...提供最大(默认情况下)元素的常量时间查找,
但是比较函数仍然是严格的弱排序:
比较类型提供严格的弱排序。
略有反直觉,但过了一段时间,它确实有意义......
P.S。:比较函数应该是const
函数,并取const
个参数,以提高效率,如我的例子所示;但这是一个额外的细节。
答案 1 :(得分:1)
优先级队列期望Comparator实现less
- 与任何其他需要弱排序的容器一样。但是,它的工作原理是将较大的元素放在顶部。由于您有效地实现了greater
,因此您撤消了队列,现在最小的元素位于顶部。
要解决此问题,请将比较器更改为返回两个元素中的较小者。