STL 中的最小堆,不带比较器

min heap in stl without comparator

本文关键字:比较器 STL      更新时间:2023-10-16

我刚刚开始使用STL,目前正在经历堆。 我只是想知道是否有办法在没有比较器的情况下在 c++/cpp 中实现最小堆。

我尝试了以下代码(来自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

我也在其他测试用例中尝试过这个,它似乎工作正常。只是想知道这在逻辑上是否正确?这是一种好的做法吗?

首先,你的代码:

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

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

我认为您正在尝试执行以下操作:

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

但这行不通,因为生成的堆仍然是一个max_heap。

话虽如此,从评论中的讨论来看,OP 的问题实际上是"在 stl 中最小堆而不编写比较器",这是微妙的不同,并导致一个非常不同的答案。

STL提供了现成的模板化比较器来处理这些情况。原因是拥有更少、更灵活的算法会更干净。API 表面越低越好。

您所要做的就是:

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