我刚刚开始使用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
我也尝试了其他测试用例,似乎工作正常。只是想知道这在逻辑上是否正确?这是一个好习惯吗?
答案 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<>());