从 C++ Primer 和 https://en.cppreference.com/w/cpp/container/priority_queue ,我知道:
我还从谷歌读到了这个 blog post 并且知道:
push
应该由 push_back
实现,没问题。
而 pop
和 top
似乎在同一个元素上运行。一个是访问它,另一个是删除它。所以我认为这两个操作应该由 pop_front()
和 front()
或 pop_back()
和 back()
来实现。
所以我很困惑,为什么要求 front()
和 pop_back()
?
例如,假设底层容器是 vector
并且有一些 int 元素,比如 1,2,3,4,5,6
。适配器接口(interface)“pop()
, top()
”如何与底层“front()
, pop_back()
”一起工作?
最佳答案
尽管 pop()
上的 priority_queue
最终会删除顶部元素,但它必须保持不变,如果所有元素都简单地移动,则不会发生这种情况。因此,它的工作原理是将顶部值从 front()
交换为 back()
和 pop_back()
,然后将置换的值与其子值之一交换,直到恢复不变式。
同样,push()
调用 push_back()
,然后执行一系列交换,尽管是在另一个方向。
注意:由于 C++ 使用最大堆(与常见约定相反),不变的是任何元素都必须大于它的两个子元素(如果它们存在)。由于大多数有用的问题都涉及最小堆,因此您几乎总是必须将 std::greater<>
指定为 Compare
模板参数。
关于c++ - 为什么优先队列需要来自底层容器的 front()、pop_back() 而不是 back()、pop_back()?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51017198/