我想知道为什么使用priority_queue
创建最小堆,应该使用std::greater
?
std::priority_queue<T, std::vector<T>, std::greater<T> > min_heap;
对我而言,由于最小值始终位于堆的顶部,因此使用的类应为std::less
更新
另一方面,由于priority_queue
(最大堆)的默认行为是在顶部保持最大值,因此我认为std::greater
应该用于最大堆创建而不是用于创建最小堆
答案 0 :(得分:8)
C ++堆函数make_heap
,push_heap
和pop_heap
在max heap上运行,这意味着使用时顶部元素是最大值默认比较器。因此,要创建最小堆,您需要使用greater<T>
而不是less<T>
。
我怀疑使用最大堆而不是最小堆是因为使用less
操作更容易实现。在C ++中,less
具有成为所有STL算法的“默认”比较器的特殊权限;如果您只是要实现一个比较操作(==
除外),它应该是<
。这导致了不幸的怪癖,priority_queue<T, C<T>, less<T>>
表示最大队列,priority_queue<T, C<T>, greater<T>>
表示最小队列。
此外,像nth_element
这样的某些算法需要最大堆。
答案 1 :(得分:6)
逻辑参数如下
std::priority_queue
是容器适配器;基本内存注意事项使后面成为序列容器(例如pop_back()
)的修改(push_back()
和std::vector
)的首选位置。 priority_queue
原语基于std::make_heap
(构造函数),std::pop_heap
+ container::pop_back
(priority_queue::pop
)和container::push_back
+ {{ 1}}(std::push_heap
)priority_queue::push
将获取底层存储的前,并将其放在后面,之后恢复堆不变量。相反的是pop_heap
。push_heap
上执行sort_heap
(最初在前面有最大值)将repeatedly pop the front to the back并根据max_heap
(默认比较运算符)对范围进行排序less
的首选实现是使最大元素为w.r.t.前面max_heap
,通过less
(基础priority_queue::top
)访问。 container::front
与priority_queue
比较器代表std::less
是否直观。它可以被定义为max_heap
通过反转比较器的参数(但是看看@TC的注释,对于C ++ 98绑定器,这是相当冗长的)在各种堆函数的调用中无处不在。一个(对我来说)反直觉的结果是min_heap
然后没有给出具有 top 优先级的元素答案 2 :(得分:0)
见http://en.cppreference.com/w/cpp/container/priority_queue。 priority_queue
旨在将最大值放在顶部。如果您使用默认的std::less
比较器,则会发生这种情况。因此,如果您想要反向行为,则需要使用反向比较器std::greater
。