对于用户定义的结构,据我所知,这很容易。只是重载运算符<。但是,对于int / float等..,我真的需要重载operator<对于int? 这是我试过的:
#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应该可以解决问题。但是,你是什么意思,我不应该使用外部比较器?如果它不是正确的方法,那么实现这一目标的常用方法是什么?
答案 0 :(得分:27)
使用std::greater<int>()
作为比较器(适用于make_heap
,push_heap
,pop_heap
的所有内容。 ()
很重要 - std::greater<int>
是一个函子类而不是函数,所以你需要一个它的实例。
答案 1 :(得分:16)
答案很好,所以我只想添加一个小例子。假设您有以下数组:
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!
答案 2 :(得分:8)
你不应该为operator <
重载int
(实际上你不能)。如果您使用外部比较器,您也应该将相同的Comparator comp
传递给pop_head
。
*编辑:*
正如ildjarn所指出的,你的比较运算符没有实现严格弱顺序关系。
a < b ? false : true; --> a >= b
b < a ? true : false; --> a > b