stl没有比较器的最小堆

时间:2018-05-13 05:57:48

标签: c++ heap

我刚刚开始使用STL,目前正在经历堆积。 我只是想知道是否有一种方法可以在没有比较器的情况下在c ++ / cpp中实现min heap。

我尝试了以下代码(geeksforgeeks的一点修改):

#include<iostream>
#include<algorithm> // for heap 
#include<vector>
using namespace std;

int main()
{
    // initializing vector;
    vector<int> vi = { 1, 6, 7, 9, 11, 4 };

    make_heap(vi.end(), vi.begin()); // swapped the start and end points

    cout << "The minimum element of heap is : ";
    cout << vi.front() << endl;

}

输出为:1

我也尝试了其他测试用例,似乎工作正常。只是想知道这在逻辑上是否正确?这是一个好习惯吗?

1 个答案:

答案 0 :(得分:1)

首先,您的代码:

make_heap(vi.end(), vi.begin());

这会导致未定义的行为,因为vi.end()是一个过去的迭代器。 I.E.它没有指向实际值,并且取消引用它将是非法的。

我认为您试图执行以下操作:

make_heap(vi.rbegin(), vi.rend());

但那不会奏效,因为产生的堆仍然是max_heap。

话虽如此,从评论中的讨论来看,OP的问题实际上是“在没有编写比较器”的情况下的最小堆积,这是微妙的不同,并导致一个非常不同的答案。 / p>

STL提供现成的模板化比较器以处理这些情况。原因是拥有更少,更灵活的算法更清晰。 API表面越低越好。

您需要做的就是:

make_heap(vi.begin(), vi.end(), std::greater<>());