priority_queue真的会产生堆吗?

Does priority_queue really produce a Heap?

本文关键字:queue 真的 priority      更新时间:2023-10-16

我在 STL 中的堆和priority_queue C++有点困惑。priority_queue真的会产生堆吗?

如果我们按顺序插入元素 - 5、1、10、30、20 maxHeap 的输出将为:30、20、5、1、10 而priority_queue的输出将是:30、20、10、5、1

这背后的原因是什么?

priority_queue总是排序的吗?

让我们看看标准要求什么:

[priqueue.cons.alloc]/4:

template <class Alloc> priority_queue(const Compare& compare, const Container& cont, const Alloc& a);

效果:初始化ccont为第一个参数,a为第二个参数,用compare初始化comp;呼叫make_heap(c.begin(), c.end(), comp)

[着重号后加]

同样,在 [priqueue.members]/1:

void push(const value_type& x);

效果:仿佛:
c.push_back(x);
push_heap(c.begin(), c.end(), comp);

[着重号后加]

。等等。

总结

priority_queue是根据将堆操作应用于集合来定义的。

在内部,priority_queue中的元素存储为堆。Jerry Coffin的回答在规范中提供了保证这一点的确切措辞。

但是,每当从队列中删除元素时,它都会从堆中删除最大的元素并将其返回给您,因此您看到的顺序与元素最初排序的顺序不同。

从这个意义上说,内部堆排序是存在的,以便队列可以有效地按排序顺序生成元素的外部排序。堆只是一个原则上你不应该看到的实现细节。