如何在C ++标准库中更改堆中的max元素?

时间:2015-04-15 23:34:09

标签: c++ algorithm stl heap

如果我有最大堆,并且如果我需要更改max元素,则归结为单个冒泡算法。有没有办法通过C ++标准库来实现这一点,而无需手动编写算法?

据我所知,它应该等同于pop_heap + push_heap,但是这是2次冒泡操作,而不仅仅是一次。

那么 - 这个通过库API公开的冒泡算法是什么?

2 个答案:

答案 0 :(得分:10)

如果您愿意在自己的容器std::pop_heap()上致电v,那么您可以先在容器上v.push_back()进行修改"}弹出堆之前的元素。然后,缩小v

// Precondition is that v is already a heap.
void change_max_element (std::vector<int> &v, int modified_value) {
    v.push_back(modified_value);
    std::pop_heap(v.begin(), v.end());
    v.pop_back();
}

这&#34;工作&#34;因为std::pop_heap()被定义为交换第一个和最后一个元素并且向下冒泡。但是,还要求输入序列应该是有效堆。如果我们能够定义一个专门的比较操作,允许新推回的项目报告自己属于最后一个位置(如果它已经在最后一个位置),那么它在技术上可以满足要求。

答案 1 :(得分:1)

您最接近的是std::make_heap可能比简单地弹出/推送慢。

但是,boost heap(s?)有&#34; Fixup Interface&#34;它允许你想要的修改。 http://www.boost.org/doc/libs/1_51_0/doc/html/heap/concepts.html#heap.concepts.mutability