Перегрузка make_heap?

0

У меня есть std::vector<t_Mont> v, t_Mont имеют {float val, int я и int j}

Я хочу сделать make_heap(v.begin(), v.end()) и pop_head(v.begin(), v.end()) но на консоли появляется много ошибок. Я думаю, это потому, что я t_mont вектор типа t_mont.

Я хочу make_heap на значение переменной val v.

Что мне нужно сделать, чтобы скомпилировать меня? Мне нужно перегружать make_heap и pop_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());
}
Теги:
heap
overloading

3 ответа

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());
  • 0
    Большое спасибо, это работает;)
1

t_Mont должен быть сопоставим с operator< для этого, чтобы работать, или вам нужно использовать другую форму std::make_heap и передать функтор сравнения рядом с итераторами (если по какой-то причине вы не хотите, чтобы 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 < b и b < c означает a < c, and !(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.
  }
}

с теми же условиями.

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);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню