priority_queue真的会产生堆吗?
Does priority_queue really produce a Heap?
我在 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);
效果:初始化
c
,cont
为第一个参数,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的回答在规范中提供了保证这一点的确切措辞。
但是,每当从队列中删除元素时,它都会从堆中删除最大的元素并将其返回给您,因此您看到的顺序与元素最初排序的顺序不同。
从这个意义上说,内部堆排序是存在的,以便队列可以有效地按排序顺序生成元素的外部排序。堆只是一个原则上你不应该看到的实现细节。
相关文章:
- 在决定是通过参考还是通过价值时,尺寸真的是一个问题吗
- 字节真的是最小可寻址单元吗
- 为什么这个 std::queue/指向结构的指针列表直到 List.Size() == 0 才释放内存?
- 如果我真的真的想从 STL 容器继承,并且我继承构造函数并删除新运算符,会发生什么?
- 如何在 std::vector 中找到<bool>哪些索引是真的?
- std::string 的对象真的可以移动吗?
- 在这种情况下,我真的复制了字节还是复制了字符?
- 将参数打包的参数传递到 std::queue 中,以便稍后使用不同的函数调用
- int8_t和uint8_t真的是整数吗?它们有什么用?
- 真的没有来自 std::string_view 的 std::string 的显式构造函数吗?
- 查找不等式为真的次数时出现问题
- 考虑到其他好处,关键字'auto'真的有助于简化调试C++吗?
- 有没有更好的方法来处理异常? try-catch块真的很丑
- 在为嵌套类定义行外友元时,我真的必须打破封装吗?
- 你如何理解"std: :forward is just syntactic sugar"?这是真的吗?
- "std::forward"和"std::move"真的不生成代码吗?
- C++ queue.front();为什么不从第一个元素开始呢?
- VS 2017 和 2019 运行 c++ 真的很慢
- 结构和类在C++中真的等价吗?
- 指向数组unique_ptr在调用 release() 后会自动释放动态内存,这是真的吗?