【发布时间】:2016-10-15 14:25:02
【问题描述】:
我正在阅读有关 priority_queue(基本上是 make_heap 的包装器)的文档,发现您可以使用比较函数对其进行自定义。
来自文档(http://en.cppreference.com/w/cpp/container/priority_queue):
可以提供用户提供的比较来更改排序,例如 使用 std::greater 会导致最小元素显示为 顶部()。
在维基百科和其他 CS 文本中,堆是这样定义的:
在计算机科学中,堆是一种专门的基于树的数据结构 满足堆属性:如果 A 是 B 的父节点,则 节点 A 的键(值)相对于节点 B 的键进行排序 在整个堆中应用相同的顺序。一个堆可以 进一步分类为“最大堆”或“最小堆”。 最大 heap,父节点的key总是大于等于 那些孩子的,最高的关键在根节点。
但在 std::priority_queue 实现中,提供 std::greater 会导致创建 MinHeap(顶部的最小元素)。如果(父比较器子项)为真,我会期望一个最大堆,因为堆排序是定义的(在我读过的所有文献中)。
我发现这种 API 设计令人困惑。
有理由这样定义吗?
【问题讨论】:
标签: c++ algorithm c++11 priority-queue