priority_queue真的会产生堆吗?

时间:2017-10-05 15:22:36

标签: c++ stl heap priority-queue

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

If we insert elements in order - 5, 1, 10, 30, 20
Output for maxHeap will be: 30, 20, 5, 1, 10
While output for priority_queue will be: 30, 20, 10, 5, 1

这背后的原因是什么?

priority_queue是否始终排序?

2 个答案:

答案 0 :(得分:3)

让我们看看标准要求:

[priqueue.cons.alloc] / 4:

  

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

     

效果:初始化ccont作为第一个参数,a作为第二个参数,并用{{1}初始化comp }}; 致电compare

[强调补充]

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

  

make_heap(c.begin(), c.end(), comp)

     

效果:好像通过:
      void push(const value_type& x);
      的 c.push_back(x);

[强调补充]

......等等。

摘要

push_heap(c.begin(), c.end(), comp);是根据将堆操作应用于集合而定义的。

答案 1 :(得分:0)

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

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

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