C ++中的push_heap函数有什么作用?

时间:2011-10-26 15:32:25

标签: c++ stl heap

我想知道带有三个参数的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

中编写

2 个答案:

答案 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