## Итераторы, алгоритмы STL и лямбда выражения.

```cpp
#include <iostream> // для cout, endl
#include <vector> // для vector
#include <tuple> // для tuple и tie
#include <string> // для string
#include <iterator> // для явного указания типа при использовании итераторов
#include <algorithm> // Для большенства STL алгоритмов, но не всех. Некоторые представлены в других заголовочных файлах.
#include <iomanip> // для setw, left, right
using namespace std; // глобально в файле подключаем пространство имен std

typedef tuple<string, string, bool, size_t, pair<double, size_t>> student_data; // как в Си

void print0(const vector<student_data>& 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<bool>(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<student_data>& group)
{
	size_t i = 0;
	// можно auto iter = group.begin()
	for(vector<student_data>::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<student_data>& 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<student_data>& 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<string, string, bool, size_t, pair<double, size_t>>
	// 0: string, имя студента
	// 1: string, фамилия студента
	// 2: bool, пол студента - 0 женский, 1 мужской
	// 3: size_t, номер зачетной книжки
	// 4: pair<double, size_t>, пара = средний балл и число сданных предметов
	
	vector<student_data> 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<size_t>(l) < get<size_t>(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` определите медианную среднюю оцеку в группе.