我正在尝试在c ++中为我创建的结构类型实现最小堆。我创建了一个类型的向量,但是当我在其上使用make_heap时崩溃了,这是可以理解的,因为它不知道如何比较堆中的项目。如何为结构类型创建最小堆(即顶部元素始终是堆中最小的元素)?
结构如下:
struct DOC{
int docid;
double rank;
};
我想使用排名成员比较DOC结构。我该怎么做?
我尝试使用带有比较器类的优先级队列,但也崩溃了,使用数据结构似乎很愚蠢,当我真正需要的是一个堆时,使用堆作为它的基础。
非常感谢, BSG
答案 0 :(得分:5)
只需创建自己的“仿函数”进行比较。由于您需要“最小堆”,因此比较函数的行为应该类似于大于运算符:
#include <iostream>
#include <vector>
#include <algorithm>
struct doc {
double rank;
explicit doc(double r) : rank(r) {}
};
struct doc_rank_greater_than {
bool operator()(doc const& a, doc const& b) const {
return a.rank > b.rank;
}
};
int main() {
std::vector<doc> docvec;
docvec.push_back( doc(4) );
docvec.push_back( doc(3) );
docvec.push_back( doc(2) );
docvec.push_back( doc(1) );
std::make_heap(docvec.begin(),docvec.end(),doc_rank_greater_than());
std::cout << docvec.front().rank << '\n';
}
在进一步的堆操作中始终使用相同的比较函数非常重要。
答案 1 :(得分:2)
添加比较运算符:
struct DOC{
int docid;
double rank;
bool operator<( const DOC & d ) const {
return rank < d.rank;
}
};
结构几乎总能有效地拥有构造函数,所以我还要添加:
DOC( int i, double r ) : docid(i), rank(r) {]
也是结构。