【问题标题】:Is there a reason why std::priority_queue as MinHeap requires greater than comparer; MaxHeap, less than comparer? [closed]为什么 std::priority_queue as MinHeap 需要大于比较器? MaxHeap,小于比较器? [关闭]
【发布时间】:2020-12-31 04:06:06
【问题描述】:

例如,当我使用 std::priority_queue 作为最小堆时,我需要执行以下操作:

struct MyType{
   ...
   int data;
};

auto greaterThanCmp = [](const MyType& a, const MyType& b){ return a > b; };

std::priority_queue<MyType, std::vector<MyType>, greaterThanCmp> minHeap;

我的问题是:如果委员会/实施者走这条路,那么为 Min Heap 提供 GreaterThanCmp 或小于比较器是否也有优势。

或者换句话说,为什么标准选择一个而不是另一个?

我已经尝试使用 lessThanCmp 来实现我的 MinHeap 类,只是为了它。我测试了我的代码,它运行良好。

非常感谢您提前回复!

【问题讨论】:

  • “为什么标准选择一个而不是另一个?”——因为他们不能同时选择两者?我想你真的想问他们为什么特别选择std::less 而不是std::greater?另外,您是单独查看priority_queue,还是在您的问题中包含其他订购的容器(如std::set)?
  • comparator 函数只是决定元素的顺序。 greaterThan 允许最小的元素首先出现,而lessThan 允许最大的元素首先出现。标准选择 std::less 作为默认值。
  • 我猜这没有什么特别的原因。可能只是大多数标准函数使用 less 作为默认比较器,而较大的值“通常”具有更多 priority。

标签: c++ stl std priority-queue


【解决方案1】:

一旦你有了一个greater 对象,你就可以轻松地用它创建一个less 对象: less ::operator() (a, b) { return greater (b, a) }。所以less 的要求没有限制。

【讨论】:

    猜你喜欢
    • 2016-05-13
    • 2018-12-17
    • 2017-07-28
    • 1970-01-01
    • 1970-01-01
    • 2021-01-21
    • 2021-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多