从 C++ Primer 和 https://en.cppreference.com/w/cpp/container/priority_queue ,我知道:



我还从谷歌读到了这个 blog post 并且知道:


push 应该由 push_back 实现,没问题。
poptop 似乎在同一个元素上运行。一个是访问它,另一个是删除它。所以我认为这两个操作应该由 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/

10-12 21:23