Я работаю над программой, которая создает вектор из 4 клиентов, а затем сортирует их в куче, используя класс компаратора (по сути, сортируя их по балансу счета). После этого я просто распечатываю заказанные номера счетов каждого Клиента в векторе. Тем не менее, я не думаю, что это правильно реализовано. Во-первых, когда я вызываю сортировку кучи STL по вектору, я понимаю, что передаю компаратор в качестве третьего аргумента. У меня сложилось впечатление, что мне нужно вызвать его с помощью объекта моего класса компаратора AccountOrder, но это дало мне большое количество ошибок. Если я вызываю его в классе, а не в экземпляре этого класса, это не дает мне почти столько же ошибок. Как правильно это сделать?
int main()
{
AccountOrder f;
vector<Client> list;
Client client1(345.88, "Charlie");
Client client2(249.12, "Rashesh");
Client client3(442.90, "Michael");
Client client4(543.74, "Mary");
list.push_back(client1);
list.push_back(client2);
list.push_back(client3);
list.push_back(client4);
make_heap(list.begin(), list.end(), f);
sort_heap(list.begin(), list.end(), f);
for(int i = 0; i < list.size(); i++)
cout << list[i].getAccountBalance();
system("pause");
return 0;
}
Класс компаратора:
class AccountOrder
{
public:
bool operator()(Client * a, Client * b)
{
return a->getAccountBalance() > b->getAccountBalance();
};
};
Компаратор был реализован в моем коде чуть выше функции main (). Во-вторых, к какой функции мне нужно передать компаратор? (Здесь я передал это обоим, я еще не уверен).
Сделать компаратор с &
вместо *
class AccountOrder
{
public:
bool operator()(const Client &a, const Client &b) const
{
return a.getAccountBalance() > b.getAccountBalance();
};
};
Сигнатура функции сравнения должна быть эквивалентна
следующий:
bool cmp(const Type1 &a, const Type2 &b);
Подпись не должна иметь констант &, но функция не должна
изменить объекты, переданные ему.
Вы должны передавать объект типа AccountOrder
, Тем не менее, ваш operator()
имеет неправильную подпись для передачи std::make_heap
, Это должно занять const
ссылочные аргументы, а не указатели:
bool operator()(const Client& a, const Client& b)
{
return a.getAccountBalance() > b.getAccountBalance();
};
Вы должны заметить, что вам не нужно делать это с функтором. Вы можете просто иметь функцию с соответствующей подписью и передать ее std::make_heap
, Или в C ++ 11, просто используйте лямбда-выражение.
Во-первых вы сортируете Client
не Client
указатели, во вторых ваши operator()
должен быть объявлен const
,
class AccountOrder
{
public:
bool operator()(const Client& a, const Client& b) const
{
return a.getAccountBalance() > b.getAccountBalance();
};
};