我知道std::priority_queue
类实现了minheap。有没有办法将其用作最大堆?还是有替代的Maxheap结构?我知道我可以在带有lambda的std::make_heap()
上使用std::vector
函数来创建自己的Maxheap,但是使用std::pop_heap()
这样的函数很奇怪,我认为它们不容易使用。就像我认为的min_heap(优先级队列)一样,应该有一种更简单的方法。
答案 0 :(得分:5)
可以提供用户提供的
Compare
来更改顺序,例如使用std::greater<T>
将导致最小元素显示为top()
。
由于std::less<T>
是Compare
模板参数的默认模板参数,因此默认情况下它已经是 max heap 。如果您想要一个 min堆(上面的引用表明),则将std::greater<T>
而不是std::less<T>
用作模板参数。
总结:
std::less<T>
(这是默认的模板参数)。std::greater<T>
。请注意,std::priority_queue
实际上是一个容器适配器(与数据结构相反)。它没有指定正在使用的底层数据结构。但是,由于操作push()
,pop()
和top()
的指定运行时复杂性,很可能将其实现为堆。
答案 1 :(得分:-1)
没有“堆”容器,就好像没有“搜索树”或“哈希图”一样(而不是后两个,有序和无序关联容器,实际上是使用这些数据结构实现的,因为没有其他数据结构可以满足为这些容器指定的要求。
有一个 容器适配器std::priority_queue
,它可以适配一个SequenceContainer(默认情况下适配std::vector
),并提供与最大/最小堆相同的操作,并可能在内部实现为某种堆。
还有std::make_heap
可以用来在随机访问范围内强制使用最大堆属性。