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

How to change max element in a heap in C++ standard library?

本文关键字:C++ max 元素 标准      更新时间:2023-10-16

如果我有一个最大堆,如果我需要更改max元素,那么它归结为单个气泡下降算法。有没有办法通过C++标准库做到这一点,而无需手动编码算法?

我知道它应该相当于 pop_heap + push_heap,但那是 2 个气泡下降操作,而不仅仅是一个。

那么 - 这种气泡下降算法是否通过库 API 公开?

如果您愿意在自己的容器v上调用std::pop_heap(),那么您可以在弹出堆之前先在容器上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();
}

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

你得到的最接近的是std::make_heap这可能比简单的弹出/推送慢。

但是,提升堆具有"修复界面",允许根据需要进行修改。 http://www.boost.org/doc/libs/1_51_0/doc/html/heap/concepts.html#heap.concepts.mutability