C ++标准库中有maxheap吗?

时间:2019-07-30 12:06:34

标签: c++ priority-queue c++-standard-library standard-library max-heap

我知道std::priority_queue类实现了minheap。有没有办法将其用作最大堆?还是有替代的Maxheap结构?我知道我可以在带有lambda的std::make_heap()上使用std::vector函数来创建自己的Maxheap,但是使用std::pop_heap()这样的函数很奇怪,我认为它们不容易使用。就像我认为的min_heap(优先级队列)一样,应该有一种更简单的方法。

2 个答案:

答案 0 :(得分:5)

关于std::priority_queue

  

可以提供用户提供的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可以用来在随机访问范围内强制使用最大堆属性。