重载make_heap?

时间:2014-12-04 15:41:04

标签: c++ heap overloading

我有std::vector<t_Mont> vt_Mont有{float val,int i和int j}

我想make_heap(v.begin(), v.end())pop_head(v.begin(), v.end()),但我在控制台上遇到很多错误。我想这是因为我传递了t_mont类型的向量。

我希望对make_heap的变量val的值v

编译我需要做些什么?我必须重载make_heappop_head?我是怎么做到的?

感谢。

我的代码:

std::vector<t_Mont> v;
for (int i = 0; i < nCellsHeight; i++) {
    for (int j = 0; j < nCellsWidth; j++) {
        t_Mont aux;
        aux.i = i;
        aux.j = j;
        aux.val = cellValues[i][j];
        v.push_back(aux);
    }
}

std::make_heap(v.begin(), v.end());
while (v.begin() != v.end()) {
    std::cout << "Best of v = " << v[0].val << std::endl;
    std::pop_heap(v.begin(), v.end());
    v.pop_back();
    std::make_heap(v.begin(), v.end());
}

3 个答案:

答案 0 :(得分:1)

t_Mont必须与operator<具有可比性才能实现,或者您必须使用其他形式的std::make_heap并将迭代器旁边的比较函数传递给if {原因是,您不希望t_Mont通常是可排序的。)

也就是说,你必须定义

bool operator<(t_Mont const &lhs, t_Mont &rhs) {
  // return true if lhs is less than rhs, false otherwise.
}

以便获得总订单(即a < b表示!(b < a)a < bb < c表示a < c!(a < a)) ,或

struct t_Mont_compare {
  bool operator()(t_Mont const &lhs, t_Mont &rhs) const{
    // return true if lhs is less than rhs, false otherwise.
  }
}

具有相同的条件。

答案 1 :(得分:1)

默认情况下,

make_heap和相关函数会使用<比较值。您需要为您的类型提供该运算符的重载:

bool operator<(t_Mont const & lhs, t_Mont const & rhs) {
    return lhs.val < rhs.val;
}

或在调用函数时提供自定义比较器:

auto comp = [](t_Mont const & lhs, t_Mont const & rhs){return lhs.val < rhs.val;};
std::make_heap(v.begin(), v.end(), comp);

如果您坚持使用古老的pre-lambda编译器,请完整定义函数类型:

struct Comp {
    bool operator()(t_Mont const & lhs, t_Mont const & rhs){return lhs.val < rhs.val;}
};

std::make_heap(v.begin(), v.end(), Comp());

答案 2 :(得分:0)

您必须定义一个函数对象,以便在两个t_Monts之间进行比较。 make_heap的声明如下:

template <class RandomAccessIterator, class Compare> 
void make_heap (RandomAccessIterator first, RandomAccessIterator last, Compare comp );

或者只是创建一个这样的函数:

bool comp_tmonts(const t_Mont& a, const t_Mont& b)
{
   /* Insert your comparison criteria for less than here.
      Return a boolean value corresponding to whether a is less than b */
}

然后将其作为第三个参数传递给make_heap函数:

make_heap(v1.begin(), v1.end(), comp_tmonts);