因此,为了制作最大堆,我可以执行以下操作:
int main () {
int myints[] = {10,20,30,5,15};
std::vector<int> v(myints,myints+5);
std::make_heap (v.begin(),v.end());
std::cout << "initial max heap : " << v.front() << '\n';
我怀疑。就像我使用push_back操作插入向量一样,有没有什么方法可以像这样插入最大堆?或者它总是通过矢量?
其次,这是为了制作最大堆。最小堆有类似的东西吗?谢谢!
答案 0 :(得分:3)
将元素插入堆中需要两个步骤。首先,您需要在表示堆的容器后面插入一个元素。标准push_back
会这样做。然后你需要使用push_heap
,它基本上会在范围的最后一个元素上调用upheap。
对于不同的排序,您需要使用自定义版本的比较器。默认值是当第一个元素小于第二个元素时,它会返回true。所以你需要扭转逻辑。有几种方法可以做到这一点。我使用lambda显式operator>
而不是operator<
。可以使用一些更精美的模板,或者使用functional。
完整代码示例:
#include <iostream>
#include <algorithm>
int main() {
std::vector<int> v {10,20,30,5,15};
std::make_heap(v.begin(), v.end());
v.push_back(40);
std::push_heap(v.begin(), v.end()); // notice that now the v.end() points
// to different location than before
for (auto i : v) std::cout << i << ' ';
std::cout << '\n';
auto cmp = [](int a, int b) { return a>b; }; // custom comparator via lambda
std::make_heap(v.begin(), v.end(), cmp); // make a new heap using `cmp`
v.push_back(3); // add another element
std::push_heap(v.begin(), v.end(), cmp); // restore heap structure using `cmp`
for (auto i : v) std::cout << i << ' ';
return 0;
}
为了functional
更大的例子:
#include <iostream>
#include <algorithm>
#include <functional>
int main() {
std::vector<int> v {10,20,30,5,15};
auto cmp = std::greater<int>(); // make an instance of standard `greater` comparator
std::make_heap(v.begin(), v.end(), cmp); // make a new heap using `cmp`
v.push_back(3); // add another element
std::push_heap(v.begin(), v.end(), cmp); // restore heap structure using `cmp`
for (auto i : v) std::cout << i << ' ';
return 0;
}