使用stl维护最小堆的简单方法

easy way to maintain a min heap with stl?

本文关键字:简单 方法 stl 维护 使用      更新时间:2023-10-16

对于用户定义的结构体,据我所知,这很容易。只需重载操作符

       #include <iostream>
       #include <algorithm>
       #include <vector>
       using namespace std;
       bool comp(const int& a, const int& b)
       {
          return a<b?false:true;
       }
       int main () 
       {
         int myints[] = {10,20,30,5,15};
         vector<int> v(myints,myints+5);
         vector<int>::iterator it;
         make_heap(v.begin(), v.end(), comp);
         cout << "initial min heap   : " << v.front() << endl;
         for (unsigned i=0; i<v.size(); i++) cout << " " << v[i];
         cout<<endl;
         pop_heap (v.begin(),v.end());
         v.pop_back();
         for (unsigned i=0; i<v.size(); i++) cout << " " << v[i];
         cout<<endl;
       }

的结果是:

        initial min heap   : 5
        5 10 30 20 15
        30 10 15 20

现在pop_heap, push_heap不会正确维护最小堆?有什么更简单的方法可以做到这一点吗?谢谢!

编辑:对不起,我没有仔细检查说明书。是的,将comp传递给pop_heap或push_heap应该可以达到这个目的。但是,你说我不应该使用外部比较器是什么意思?如果这不是正确的方法,那么常见的方法是什么?

使用std::greater<int>()作为比较器(对所有make_heap, push_heap, pop_heap)。()很重要——std::greater<int>是一个函子类而不是一个函数,所以你需要一个它的实例。

答案很好,所以我只想添加一个小示例。假设您有以下数组:

array<int, 10> A{5,2,8,3,4,1,9,12,0,7};

,你想创建一个min heap。最快的方法是使用make_heap算法。但是,这在默认情况下会创建一个max heap。换句话说,如果你调用:

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

A变为max heap。另一方面,要拥有min heap,您需要添加比较器,但不需要实现比较器。而是按如下方式调用该方法:

make_heap(A.begin(), A.end(), greater<int>());

这个调用将使你的数组为min heap

PS: #include <algorithm>是使用std::make_heap所必需的。同样的操作也适用于vector

HTH !

您不需要为int重载operator <(实际上您不能)。如果您使用外部比较器,您也应该将相同的Comparator comp传递给pop_head

* Edit: *

正如ildjarn所指出的,比较运算符没有实现严格弱排序关系。

a < b ? false : true; --> a >= b
b < a ? true : false; --> a > b