当前位置: 首页 > 知识库问答 >
问题:

优先级队列自定义比较器的返回值表示什么?

那谦
2023-03-14
struct event
{
    int index, arrival, duration, type, end;
};

struct compare
{
    bool operator() (event a, event b)
    {
        if (a.arrival < b.arrival) return true; // which one gets pushed first?
        else return false;
    }
};
...
priority_queue < event, vector <event>, compare > pq;

我不理解的是返回truefalse的含义。如果返回true,则哪个元素首先被推送到队列中,如果返回false则是哪个元素?

共有1个答案

华欣怡
2023-03-14

std::priority_queue是一个max堆,默认情况下使用std::less(它是一个使用运算符<)的函数对象。这意味着如果比较返回false,则第一个参数更接近顶部。从CPPreference:

优先级队列是一个容器适配器,它提供最大(默认情况下)元素的恒定时间查找,以对数插入和提取为代价。

可以提供用户提供的比较来更改排序,例如,使用std::greater 将导致最小的元素显示为top()

标准引用是[alg.heap.operations]。

边注1:如果(expr)返回true,则避免编写;else返回false;而只支持返回expr;

旁注2:运算符()应该是const成员函数,并通过引用const来获取其参数,以避免不必要的复制。

 类似资料:
  • priority_queue,comparator(query,d)>min_heap; main.cpp:20:7:注意:“comparator”不是文字,因为: class comparator{ main.cpp:20:7:注意:“comparator”不是聚合,没有普通的默认构造函数,也没有不是复制或移动构造函数的constexpr构造函数 Main.cpp:92:65:注意:应为类型,但

  • 我使用的是PriorityQueue和我自己的比较器,但最终结果并不总是好的。我应该按平均成绩、姓名、身份证进行排序。最后,它应该返回队列中剩余的名称。其余的名字都很好,但顺序不同。输入(名称、平均等级、识别号): 预期产出: 我的结果: 你能帮我找出问题所在吗?提前谢谢你!

  • 假设我实现了一个HashMap,其中字符被分配了一个值的ArrayList。 我已经在HashMap中创建了这些字符的PriorityQueue,但我希望能够根据此优先级删除这些字符: {a,b,c} {a,b}删除c,因为它的ArrayList中包含一个值,该值决定必须首先删除它。 对此最好的方法是什么?

  • 由于我对优先级队列的了解有限,所以我尝试实现它,但只能在asc或desc值xx中排序,这不是必需的。 我的方法是 请分享一些想法/方法。 看来很遗憾,我无法为我的情况提供所需的比较器。 不过,还是要在期待中感谢你

  • 我试图用自定义比较器定义优先级队列,如下所示: 这就是显示的编译错误 我还尝试在测试类中声明另一个比较函数,但没有效果。为什么主函数中的优先级队列编译而类中的优先级队列不编译?为比较器定义专用类是这里唯一的工作吗?谢谢你。

  • 有人能解释一下这里使用的比较运算符的语法吗?它是做什么的