我对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是否始终排序?
答案 0 :(得分:3)
让我们看看标准要求:
[priqueue.cons.alloc] / 4:
template <class Alloc> priority_queue(const Compare& compare, const Container& cont, const Alloc& a);
效果:初始化
c
,cont
作为第一个参数,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的回答提供了保证这一点的规范中的确切措辞。
但是,每当从队列中删除一个元素时,它会从堆中删除最大的元素并将其返回给您,因此您看到的顺序与最初排序元素的顺序不同。
从这个意义上讲,内部堆排序是存在的,这样队列就可以按排序顺序有效地生成元素的外部排序。堆只是一个实现细节,原则上你不应该看到它。