C ++中min-heap的比较器

时间:2012-12-24 04:02:39

标签: c++ stl heap comparator min-heap

我正在尝试使用STL long等在C ++中创建make_heap的最小堆 1 ,但我的比较器似乎不是比较得当。以下是我目前的比较器:

struct greater1{
    bool operator()(const long& a,const long& b) const{
        return a>b;
    }
};

但是,当我std::pop_heap(humble.begin(),humble.end(),g); ggreater1的实例时,humble[9,15,15,25] sort_heap的{​​{1}}被叫,我弹出15

我的比较器是否正确?什么可能出错?

编辑:
我意识到我正在运行没有比较器的sort_heap,而当我运行这个比较器时,我从[15,15,9,25]得到sort_heap。现在我在想我的比较器肯定不起作用,但不确定原因。

1 默认情况下,STL创建一个最大堆,所以我需要一个比较器。

3 个答案:

答案 0 :(得分:17)

也许你错过了某个地方,下面的代码按预期工作:

#include <vector>
#include <algorithm>
#include <iostream>

struct greater1{
  bool operator()(const long& a,const long& b) const{
    return a>b;
  }
};

int main() {
  std::vector<long> humble;
  humble.push_back(15);
  humble.push_back(15);
  humble.push_back(9);
  humble.push_back(25);

  std::make_heap(humble.begin(), humble.end(), greater1());
  while (humble.size()) {
    std::pop_heap(humble.begin(),humble.end(),greater1());
    long min = humble.back();
    humble.pop_back();  
    std::cout << min << std::endl;
  }

  return 0;
}

答案 1 :(得分:10)

只需使用greater<int>()即可。它是在std。

中预定义的

答案 2 :(得分:1)

您想再次在向量上调用 make_heap ,而不是 sort_heap 。在给定大于比较器的情况下, make_heap 会将整个向量重新排列到最小堆中,而 sort_heap 将元素按升序排序,并且根本不再是堆!

header("Refresh:0; url=index.php");