Вектор сортировки кучи клиентов, пропуская итераторы неправильно?

Я работаю над программой, которая создает вектор из 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 (). Во-вторых, к какой функции мне нужно передать компаратор? (Здесь я передал это обоим, я еще не уверен).

1

Решение

Сделать компаратор с & вместо *

class AccountOrder
{
public:
bool operator()(const Client &a, const Client &b) const
{
return a.getAccountBalance() > b.getAccountBalance();
};
};

 

вmake_heap а также sort_heap:

Сигнатура функции сравнения должна быть эквивалентна
следующий:

bool cmp(const Type1 &a, const Type2 &b);

Подпись не должна иметь констант &, но функция не должна
изменить объекты, переданные ему.

0

Другие решения

Вы должны передавать объект типа AccountOrder, Тем не менее, ваш operator() имеет неправильную подпись для передачи std::make_heap, Это должно занять const ссылочные аргументы, а не указатели:

bool operator()(const Client& a, const Client& b)
{
return a.getAccountBalance() > b.getAccountBalance();
};

Вы должны заметить, что вам не нужно делать это с функтором. Вы можете просто иметь функцию с соответствующей подписью и передать ее std::make_heap, Или в C ++ 11, просто используйте лямбда-выражение.

0

Во-первых вы сортируете Clientне Client указатели, во вторых ваши operator() должен быть объявлен const,

class AccountOrder
{
public:
bool operator()(const Client& a, const Client& b) const
{
return a.getAccountBalance() > b.getAccountBalance();
};
};
0