C/C++
Помогите с сортировкой вектора объектов по 3 параметрам
Есть объект книга и есть их вектор. Как его отсортировать по дате выхода книг. Тоесть сначало по году, потом по месяцу и дню (в классе книга есть дата записанная 3 параметрами и функции get). Знаю, что в sort есть 3 параметр, но не знаю как им пользоваться. Буду благодарен если напишите реализации и поеснение к ней
#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;
}
#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;
}
Для вашего примера будет как-то так: https://ideone.com/19cVO6
Просто почитайте что такое функция-компаратор. Много сайтов с понятными объяснениями есть
Просто почитайте что такое функция-компаратор. Много сайтов с понятными объяснениями есть
Osman
Сделал так же, но выдает такие ошибки
error C3867: "HeroFunctions::comp": нестандартный синтаксис; используйте "&", чтобы создать указатель на член
error C2672: "sort": не найдена соответствующая перегруженная функция
error C2780: void std::sort(const _RanIt,const _RanIt): требует аргументов: 2, имеется: 3
error C3867: "HeroFunctions::comp": нестандартный синтаксис; используйте "&", чтобы создать указатель на член
error C2672: "sort": не найдена соответствующая перегруженная функция
error C2780: void std::sort(const _RanIt,const _RanIt): требует аргументов: 2, имеется: 3
Osman
Вот весь проект github.com/LavrovSergey/test
Похожие вопросы
- Сравнение скорости сортировки выбором и сортировки слиянием (SelectionSort vs MergeSort)
- Не могу разобраться. Функция удаления отрицательных элементов вектора
- Выполните сортировку массивов ТРЕМЯ СПОСОБАМИ: методом пузырька, прямого поиска и быстрой сортировкой. С++
- Выполните сортировку массивов ТРЕМЯ СПОСОБАМИ: методом пузырька, прямого поиска и быстрой сортировкой. С++
- Задача на сортировку структур. Язык C++.
- Задание на С++ Тема: Вектор
- Проблемы с сортировкой массива методом пузырька.
- С++ Не работает двумерный вектор (std::vector)
- Правильно ли решил задание? Решение задания на тему вектор по С++.
- Правильно ли решено задание по Яндекс практикуму на тему Вектор, урок 4 на языке программирования С++ ?
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);
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;