我想知道带有三个参数的push_heap函数是做什么的?
#include <iostream>
#include <cassert>
#include <algorithm>
#include <vector>
using namespace std;
class HeapCompare_f
{
public:
bool operator() ( int x, int y ) const
{
return x > y;
}
};
int main()
{
vector<int> vector1(5);
for (int i = 0; i < 5; ++i)
vector1[i] = 5-i;
for (int i = 0; i < 5; ++i)
cout << vector1[i];
cout << endl;
push_heap(vector1.begin(), vector1.end(),HeapCompare_f());
for (int i = 0; i < 5; ++i)
cout << vector1[i];
cout << endl;
return 0;
}
此代码的输出是
54321
15324
我也想知道如何在C中实现该功能?因为我将在A *算法中使用它,我在C
中编写答案 0 :(得分:6)
此功能不将一系列值转换为堆!
std::push_heap(first, last [, comp])
假设范围[first,last-1)
已经是有效的heap并将位置last-1
的值推入堆中,将其移动到正确的位置以保持堆要求有效。它使用<
运算符来确定元素的排序或用户指定的比较器。
答案 1 :(得分:6)
您正在错误地使用push_heap。
初始化矢量后,需要按堆次序排列:
std::make_heap(vector1.begin(), vector1.end());
要将更多元素添加到堆中,您需要先将每个元素推送到向量的后面,然后调用push_heap:
vector1.push_back(42);
std::push_heap(vector1.begin(), vector1.end());
最后,要删除堆中的第一个元素,需要调用pop_heap,然后弹出向量中的最后一个元素:
std::pop_heap(vector1.begin(), vector1.end());
vector1.pop_back();
三参数堆函数允许您指定比较方法来控制正在正确执行的堆顺序。
手动push_back和pop_back调用的原因是堆函数只将迭代器看到容器中,并且无法访问容器本身。由于迭代器不足以修改容器的内容,因此必须由容器的所有者(您)手动完成。
为避免自行处理任何问题,我建议您使用std::priority_queue
。