如何在标准库中更改堆C++ max 元素
How to change max element in a heap in C++ standard library?
如果我有一个最大堆,如果我需要更改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
相关文章:
- <streamsize>C++ 中 numeric_limits::max() 的值
- 黑客级别的Mini-Max Sum
- 'max'匹配'std::function<const int &(const int &, const int &)>'无过载
- 关于 std::min, std::max 中的比较运算符的混淆
- 找到一种有效的方法,在 2 个巨大的缓冲区上执行 MAX,每字节字节
- std::max() 函数与定点实现的比较中的问题
- 使用 CImg 库的 std::min 和 std::max 的编译问题
- 在 3ds Max 中更新进度条后,环境和效果 UI 不刷新
- 从自定义类获取对象向量中的 max 元素
- 如何在C++中递归地找到max元素的索引?
- SFINAE 与 numeric_limits<T>::max() 在 MSVC2017 上
- 这句话是什么意思 - " vector<long long> distance(n, std::numeric_limits<long long>::max()); "?
- 在f2c.h文件中定义min()max()宏时出错
- c++curl返回413请求实体过大,但是post大小远小于max大小
- 在枚举类型上使用std::max是不是一种糟糕的做法
- 为什么Visual Studio 2019不支持用于减少Openmp的关键字"max"?
- 没有函数模板的实例"max"与参数列表参数类型匹配(int、int)
- 如何在 C++11 中将 std::max 与自定义比较器一起使用?
- 为什么在这种情况下不能将 Max 用作函数?
- 为什么 UInt64 变量不能包含大于 UInt32::Max 的值?