c – 使用`std :: greater`通过`priority_queue`创建最小堆的原因
作者:互联网
我想知道为什么使用priority_queue创建一个最小堆,应该使用std :: greater?
std::priority_queue<T, std::vector<T>, std::greater<T> > min_heap;
对我来说,由于最小的值总是位于堆的顶部,因此使用的类应该是std :: less
更新:
另一方面,由于priority_queue(max heap)的默认行为是在顶部保持最大值,因此我认为std :: greater应该用于最大堆创建而不是用于创建最小堆
解决方法:
逻辑论证如下
> std :: priority_queue是一个容器适配器;基本内存注意事项使后面成为序列容器(如std :: vector)修改的首选位置(使用pop_back()和push_back()).
> priority_queue原语基于std :: make_heap(构造函数),std :: pop_heap容器:: pop_back(priority_queue :: pop)和容器:: push_back std :: push_heap(priority_queue :: push)
> pop_heap将占据底层存储的前端,并将其放在后面,之后恢复堆不变量.相反的是push_heap.
>在max_heap上执行sort_heap(最初在前面有max)将为repeatedly pop the front to the back并根据less(这是默认比较运算符)对范围进行排序
>因此,max_heap的首选实现是使最大元素为w.r.t.较少在前面,通过priority_queue :: top(底层容器::前端)访问.
>人们仍然可以辩论,使用std :: less比较器的priority_queue表示max_heap是否直观.它可以被定义为min_heap,它通过在各种堆函数的调用中反转比较器的参数(但参见@ T.C的注释,C98绑定器的注释,这是相当冗长的).一个(对我来说)反直觉的结果就是top()不会给予元素最高优先级
标签:c,c11,priority-queue,heap,min-heap 来源: https://codeday.me/bug/20190927/1822686.html