Сортировкой вектора объектов по 3 параметрам
Есть вектор с указателями на книги. Надо его отсортировать по дате(по году, потом по месяцу и дню). Еще кстати не знаю, если в векторе указатели, то и в comparator надо ставить * или &? Питаюсь сделать так
bool comparator( Book& a, Book& b) {
if (a.GetYear() < b.GetYear()) return true;
if (a.GetYear() > b.GetYear()) return false;
if (a.GetMonth() < b.GetMonth()) return true;
if (a.GetMonth() > b.GetMonth()) return false;
return a.GetDay() < b.GetDay();
}
sort(books.begin(), books.end(), comparator)
Выдает такие ошибки
error C3867: "HeroFunctions::comp": нестандартный синтаксис; используйте "&", чтобы создать указатель на член
error C2672: "sort": не найдена соответствующая перегруженная функция
error C2780: void std::sort(const _RanIt,const _RanIt): требует аргументов: 2, имеется: 3
Пытался сделать с перегрузкой
bool operator<(Book* book1, Book* book2)
{
if (book1->GetYear() == book2->GetYear())
{
if (book1->GetMonth() == book2->GetMonth())
return book1->GetDay() < book2->GetDay();
return book1->GetMonth() < book2->GetMonth();
}
return book1->GetYear() < book2->GetYear();
}
sort(books.begin(), books.end())
Выдает это
error C2804: бинарный "operator <" имеет слишком много параметров
error C2333: HeroFunctions<T,U>::operator <: ошибка в объявлении функции; пропуск основного текста
функции
error C2333: HeroFunctions<std::string,Hero>::operator <: ошибка в объявлении функции; пропуск
основного текста функции
Вот тут проект. Думаю будет проще, если запустите и там увидете ошибку и сможете исправить
Ответы (1 шт):
Автор решения: Джонни Кэтсвилл
→ Ссылка
Параметры компаратора это ссылки на сравниваемые элементы. Вы пытаетесь отсортировать вектор указателей, следовательно, компаратор должен принимать ссылки на указатели:
bool comparator(const Book* const &aa, const Book* const &bb) {
const Book& a = *aa;
const Book& b = *bb;
if (a.GetYear() < b.GetYear()) return true;
if (a.GetYear() > b.GetYear()) return false;
if (a.GetMonth() < b.GetMonth()) return true;
if (a.GetMonth() > b.GetMonth()) return false;
return a.GetDay() < b.GetDay();
}