【发布时间】:2015-12-21 06:32:40
【问题描述】:
我想知道为什么要使用priority_queue 创建最小堆,应该使用std::greater?
std::priority_queue<T, std::vector<T>, std::greater<T> > min_heap;
对我来说,因为最小值总是位于堆的顶部,所以使用的类应该是std::less
更新:
另一方面,由于priority_queue(最大堆)的默认行为是在顶部保存最大值,所以在我看来std::greater应该用于创建最大堆而不是创建最小堆
【问题讨论】:
-
你在看哪里?我现在正在阅读 cppreference.com,他们将 std::less 指定为默认值,并说替换 std::greater 会导致最小元素显示为“顶部”而不是最大元素。似乎只是约定俗成的问题,不是吗?
-
我认为这是一个很好的问题。我觉得奇怪的是,很少有人质疑这个特定的设计决定。到目前为止,您是唯一一个像我一样认为比较器的这种“反向”使用非常违反直觉的人。我不会质疑这个决定背后的绩效原因,但这对我来说并不自然。
-
我自己在回答另一个问题时遇到了这个问题,编写自己的比较器时感觉特别不自然。
-
这有点奇怪。 heapify_down 是:如果更大,则将其向下移动。和 heapify_up:如果不是更大,则向上移动。
标签: c++ c++11 heap priority-queue min-heap