C++ 如何在C++;标准图书馆?

C++ 如何在C++;标准图书馆?,c++,algorithm,stl,heap,C++,Algorithm,Stl,Heap,如果我有一个max堆,如果我需要更改max元素,它可以归结为一个气泡下降算法。有没有办法通过C++标准库来完成这一过程,而不用手工编写算法?< /P> 我知道它应该相当于pop_heap+push_heap,但这是两个冒泡操作,而不是一个 那么-这个冒泡算法是通过库API公开的吗?最接近的是std::make_heap,它可能比简单的弹出/推送慢 但是,boost堆有“Fixup接口”,它允许像您希望的那样进行修改 如果您愿意在自己的容器v上调用std::pop_heap(),那么您可以在弹出堆

如果我有一个max堆,如果我需要更改max元素,它可以归结为一个气泡下降算法。有没有办法通过C++标准库来完成这一过程,而不用手工编写算法?< /P> 我知道它应该相当于pop_heap+push_heap,但这是两个冒泡操作,而不是一个


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

最接近的是
std::make_heap
,它可能比简单的弹出/推送慢


但是,boost堆有“Fixup接口”,它允许像您希望的那样进行修改

如果您愿意在自己的容器
v
上调用
std::pop_heap()
,那么您可以在弹出堆之前先在容器上
v.push_back()
上调用“modified”元素。然后,收缩
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();
}
//先决条件是v已经是一个堆。
无效更改\u最大\u元素(标准::向量&v,整数修改的\u值){
v、 向后推_(修改的_值);
std::pop_堆(v.begin(),v.end());
v、 向后弹出();
}

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

我认为
std::make_heap
比pop和push要慢很多。对于一个小堆,它可能会更快。@rici:我不知道如何实现
make_heap
,但对于除了一个元素之外已经是堆的东西,它可能会非常快。这可能是最适合这种情况的。但这取决于实现。我完全在猜测,可能是make_heap实现或多或少需要是相同的运行时,而不管初始布局如何。不管它是如何实现的,它都需要检查每个元素,以知道除了一个元素之外,它已经是一个堆了。这就是O(N)。Pop和push是O(logn),常数乘数稍大(但可能不超过2或3),因此对于大型堆,
make_heap
不会扩展。不过有一个警告(但我认为这不是问题)。std::pop_heap()的文档要求[first,last]是一个heap,但是当您将一个新值作为last推回时,不能保证[first,last]是一个堆。我不认为这有什么关系,因为最后一个元素被移动到first并执行heapify。@szli:这是一个好的观点。未来的实现可能会利用该要求并仍然产生指定的效果。但是,它告诉我们效果是如此具体地描述的。我看了GNU/Clang/在STL的SGI实现中,唯一的假设是[first,last-1]是一个堆。第一步是交换first和last-1,然后heapify[first,last-1]。它是安全的,至少目前是这样。