【问题标题】:comparators in sort function and priority queue c++排序函数和优先级队列c ++中的比较器
【发布时间】:2018-07-04 18:03:57
【问题描述】:

在C++ Sort 函数中,第三个可选参数是用于对对象进行排序的比较器。如果我们传入 less 作为比较器,我们将按递增顺序获取对象。 (如果比较器被评估为真,则位置不会改变,否则会交换元素!)我的理解是否正确?

按照同样的方式,如果我们将一个 less 比较器传递给优先级队列,我们​​应该得到一个最小堆,(如果底层数据结构选择为向量,则对象按升序排序。如果我们调用 top( ),会返回vector的第一个元素,也就是最小的数。因此,我认为是min heap) 为什么我们得到一个max heap?

【问题讨论】:

  • 你的陈述的第一部分是正确的。但是,要获得最小堆,您需要传递 std::greater 否则默认情况下 std::less 会创建最大堆行为。这在documentation 中有说明
  • 请注意,返回 true 会使订单保持不变的假设是无效的。这两项不需要按照它们在原始向量中出现的顺序传递。
  • std::priority_queue 默认情况下只是一个最大堆。真的没有更多要解释的了。

标签: c++ comparator priority-queue min-heap max-heap


【解决方案1】:

根据this online documentation,C++ 库类std::priority_queue 首先返回最大 元素,因为比较器将较小的元素排在较大的元素之前。从上面的链接:

请注意,Compare 参数的定义使其返回 true 如果它的第一个参数出现在它的第二个参数之前 订购。但是因为优先队列输出最大的元素 首先,“之前”的元素实际上是最后输出的。那 即,队列的前面包含“最后一个”元素,根据 比较强加的弱排序。

因此,std::priority_queue<T,std::less<T>> 创建了一个最大堆并优先考虑较大的元素。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-07
    • 2020-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多