This repository has been archived on 2026-07-28. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
2025-04-13 21:48:15 +03:00

82 lines
2.9 KiB
C++

/*
Сортировка
Необходимо реализовать функцию filter_sort, которая принимает контейнер с произвольным доступом к элементам и три лямбда-функции. Первая лямбда задаёт критерий фильтрации элементов контейнера, вторая - порядок первичной сортировки элементов, третья - вторичной сортировки. Файл с решением должен содержать только реализацию шаблонной функции filter_sort. Тип элементов контейнера при тестировании может быть любым.
После подстановки вашей реализации, приведенный ниже код должен работать (при тестировании код отличается) и выдавать для примера ввода ниже пример вывода ниже:
*/
#include <iostream>
#include <vector>
#include <string>
#include <optional>
#include <algorithm>
#include <iterator>
struct Student {
std::string full_name;
int group_no;
void print() const {
std::cout << group_no << " " << full_name << std::endl;
}
static std::optional<Student> read() {
Student student;
if (!(std::cin >> student.group_no))
return {};
std::cin >> std::ws;
if (!std::getline(std::cin, student.full_name))
return {};
return student;
}
};
// Your filter_sort is here!
template <class T, class Filter, class PSort, class SSort>
void filter_sort(T& mas, Filter filter, PSort psort, SSort ssort) {
auto it = std::remove_if(mas.begin(), mas.end(), [filter](auto a) { return !filter(a); });
std::stable_sort(mas.begin(), it, [ssort](auto a, auto b) { return ssort(a, b); });
std::stable_sort(mas.begin(), it, [psort](auto a, auto b) { return psort(a, b); });
mas.erase(it, mas.end());
}
int main() {
std::vector<Student> students;
while (auto student = Student::read())
students.push_back(*student);
filter_sort(students, // the container
[](Student& stud) { return stud.group_no >= 0; }, // filter
[](Student& stud_1, Student& stud_2) { return stud_1.group_no < stud_2.group_no; }, // primary sort
[](Student& stud_1, Student& stud_2) { return stud_1.full_name < stud_2.full_name; } // secondary sort
);
for (auto& student : students)
student.print();
return 0;
}
/*
Примеры
Входные данные
-100 Иванов Иван
300 Забугоркина Афродита
0 Смирнова Настя
0 Смирнова Анастасия
Результат работы
0 Смирнова Анастасия
0 Смирнова Настя
300 Забугоркина Афродита
*/