У меня есть 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());
}
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());
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.
}
}
с теми же условиями.
Вы должны определить объект функции для сравнения между двумя 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);