C/C++

Помогите с сортировкой вектора объектов по 3 параметрам

Есть объект книга и есть их вектор. Как его отсортировать по дате выхода книг. Тоесть сначало по году, потом по месяцу и дню (в классе книга есть дата записанная 3 параметрами и функции get). Знаю, что в sort есть 3 параметр, но не знаю как им пользоваться. Буду благодарен если напишите реализации и поеснение к ней
Os
Osman
90
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
struct Date {
int year;
int month;
int day;
Date() : year(1900), month(1), day(1) {}
Date(int year, int month, int day) : year(year), month(month), day(day) {}
friend bool operator<(const Date& a, const Date& b) {
if (a.year < b.year) return true;
if (a.year == b.year && a.month < b.month) return true;
if (a.year == b.year && a.month == b.month) return a.day < b.day;
return false;
}
friend ostream& operator<<(ostream& out, const Date& d) {
if (d.day < 10) out << 0;
out << d.day << '.';
if (d.month < 10) out << 0;
out << d.month << '.' << d.year;
return out;
}
};
struct Book {
string title;
Date date;
friend bool operator<(const Book& a, const Book& b) {
return a.date < b.date;
}
friend ostream& operator<<(ostream& out, const Book& b) {
return out << b.date << ' ' << b.title;
}
};
int main() {
system("chcp 1251 > nul");
vector<Book> books{
{ "Закат Солнца вручную", { 2010, 5, 17 } },
{ "Подлодка в степях Забайкалья", { 2007, 4, 23 } },
{ "Полёт крокодила", { 2010, 5, 8 } },
{ "Зелёный Змий на охоте", { 2007, 1, 29 } },
{ "Линкор на сдачу", { 1997, 11, 18 } }
};
puts("\tДо сортировки: \n");
for (const auto& book : books) cout << book << '\n';
sort(books.begin(), books.end());
puts("\n\tПосле сортировки: \n");
for (const auto& book : books) cout << book << '\n';
puts("");
system("pause > nul");
return 0;
}
Айбек Дарибаев
Айбек Дарибаев
85 937
Лучший ответ
Osman конечно очень интересно, но ничего непонятно
Osman вектор состоит из указателей на книги. Скажите правильно ли я делаю
bool comparator(Book& book1, Book& book2)
{
if (book1.GetYear() == book2.GetYear())
{
if (book1.GetMonth() == book2.GetMonth())
return book1.GetDay() < book2.GetDay();
else
return book1.GetMonth() < book2.GetMonth();
}
else
return book1.GetYear() < book2.GetYear();
}

sort(books.begin(), books.end(), comparator);
Osman Выдает такие ошибки, что я делаю не так
error C3867: "HeroFunctions::comparator": нестандартный синтаксис; используйте "&", чтобы создать указатель на член
error C2672: "sort": не найдена соответствующая перегруженная функция
error C2780: void std::sort(const _RanIt,const _RanIt): требует аргументов: 2, имеется: 3
Айбек Дарибаев Указатель – это звёздочка, амперсанд – это ссылка.

Вот же логика сравнения:

if (a.year < b.year) return true;
if (a.year == b.year && a.month < b.month) return true;
if (a.year == b.year && a.month == b.month) return a.day < b.day;
return false;
Для вашего примера будет как-то так: https://ideone.com/19cVO6
Просто почитайте что такое функция-компаратор. Много сайтов с понятными объяснениями есть
ВД
Виктор Дымке
13 080
Osman Сделал так же, но выдает такие ошибки
error C3867: "HeroFunctions::comp": нестандартный синтаксис; используйте "&", чтобы создать указатель на член
error C2672: "sort": не найдена соответствующая перегруженная функция
error C2780: void std::sort(const _RanIt,const _RanIt): требует аргументов: 2, имеется: 3
Osman Вот весь проект github.com/LavrovSergey/test