## Итераторы, алгоритмы STL и лямбда выражения. ```cpp #include // для cout, endl #include // для vector #include // для tuple и tie #include // для string #include // для явного указания типа при использовании итераторов #include // Для большенства STL алгоритмов, но не всех. Некоторые представлены в других заголовочных файлах. #include // для setw, left, right using namespace std; // глобально в файле подключаем пространство имен std typedef tuple> student_data; // как в Си void print0(const vector& group) { // через цикл for и фунцию извлечения get for(size_t i = 0; i != group.size(); i++) { string name = get<0>(group[i]); auto surname = get<1>(group[i]); auto gender = get(group[i]); // так тоже можно, по типу auto zachete_id = get<3>(group[i]); auto score = get<4>(group[i]); cout << setw(10) << left << name << ' ' << setw(10) << left << surname << ' ' << gender << ' ' << zachete_id << ' ' << score.first << ' ' << score.second << endl; } } void print1(const vector& group) { size_t i = 0; // можно auto iter = group.begin() for(vector::const_iterator iter = group.begin(); iter != group.end(); ++iter, i++) { auto name = get<0>(*iter); auto surname = get<1>(*(group.begin() + i)); // как с указателем auto gender = get<2>(*iter); auto zachete_id = get<3>(*iter); auto score = get<4>(*iter); cout << setw(10) << left << name << ' ' << setw(10) << left << surname << ' ' << gender << ' ' << zachete_id << ' ' << score.first << ' ' << score.second << endl; } } void print2(const vector& group) { // используем структурное связывание (structured binding) for(const auto& [name, surname, gender, zachete_id, score] : group) { auto [mean, number] = score; cout << setw(10) << left << name << ' ' << setw(10) << left << surname << ' ' << gender << ' ' << zachete_id << ' ' << mean << ' ' << number << endl; } } void print3(const vector& group) { // через for_each из STL, лямбда выражение и структурное связывание (structured binding) for_each(group.begin(), group.end(), [](const auto &element) { auto [name, surname, gender, zachete_id, score] = element; auto [mean, number] = score; cout << setw(10) << left << name << ' ' << setw(10) << left << surname << ' ' << gender << ' ' << zachete_id << ' ' << mean << ' ' << number << endl; }); } int main() { //кортеж с данными о студенте tuple> // 0: string, имя студента // 1: string, фамилия студента // 2: bool, пол студента - 0 женский, 1 мужской // 3: size_t, номер зачетной книжки // 4: pair, пара = средний балл и число сданных предметов vector group = { { "Roma", "Borovik", 1, 8434562, {4.92, 12} }, { "Victoria", "Ivanova", 0, 6349523, {4.81, 13} }, { "Igor", "Kommisarov", 1, 2456246, {4.55, 8} } }; print0(group); cout << endl; // сортируем по имени по возростанию std::sort(group.begin(), group.end(), [](const student_data& l, const student_data& r){ return get<0>(l) < get<0>(r);}); print1(group); cout << endl; // сортируем по фамилии по убыванию std::sort(group.begin(), group.end(), [](const student_data& l, const student_data& r){ return get<1>(l) > get<1>(r);}); print2(group); cout << endl; // сортируем по возростанию номера зачетной книжки std::sort(group.begin(), group.end(), [](const auto& l, const auto& r){ return get(l) < get(r);}); print3(group); cout << endl; } ``` ### Требование к заданию Необходимо заполнить таблицу `group` до 10 студентов с различными средними оценками и числами сданных дисциплин (используйте только ASCII символы). Номера зачетных книжек всех студентов должны иметь строго 7 цифр и быть уникальными, а также не начинаться с цифры 0. Требуется реализовать один из вариантов с использованием STL-алгоритмов, использование циклов `for`, `while`, `do-while` запрещено. ### Варианты заданий 1. Выведите имена всех студентов мужского пола со средней оценкой выше 4. Например, с использованием `for_each`. Подсчитайте их количество с использованием `count_if`. Сформируйте дополнительный список студентов указанных студентов с использованием `for_each`. 2. Увеличите средний бал за все дисциплины на 1 у всех студентов с символом `a` в имени. Максимальный бал может быть только 5. Например, с использованием `for_each`. Затем подсчитайте количество полных отличников использованием `count_if` и добавьте их в новый дополнительный список. 3. Подсчитайте количество студентов с именем состоящим из 4-х символов. Например, с использованием `count_if`. Выделите их в новый дополнительный список. 4. Подсчитайте через `count_if` всех студентов мужского рода у которых средняя оценка меньше `3`. Удалите из `group` всех студентов мужского рода у которых средняя оценка меньше `3`, с использованием `erase` и `remove_if`. 5. Используя `for_each` поменяйте всем студентам с числом сданных дисциплин меньше `5` средний балл на `0`. Найдите двух студентов: с максимальной длиной имени и минимальной длиной фамилии, используйте `max_element` и `min_element`. 6. Используя `minmax_element` найдите студентов с максимальным и минимальным номером зачетки и поменяйте студентов местами в списке `group` с использованием `swap`. Подсчитайте число студентов, у которых номер зачетной книжки четный с использованием `count_if`. 7. С помощью `adjacent_find` найдите первых двух студентов с одинаковым числом сданных дисциплин (идущих подряд), у которых совпадают последние символы в имени. С помощью `find_if` найдите первого студента в группе со средней оценкой меньше `3`. 8. Используя `accumulate` вычислите общий средний балл в группе, а также среднюю длину имени и фамилии в группе. 9. С помощью `sort` отсортируйте группу по имени и по фамилии за одну соритровку. Продемонстрируйте, что сортировка прошла успешно используя `is_sorted`. Сравните результаты с `stable_sort`. Используя `nth_element` определите медианную среднюю оцеку в группе.