Заголовок `<algorithm>`
STL предоставляет более 100 готовых алгоритмов, работающих с итераторами.
▸Сортировка
1#include <algorithm>2#include <vector>34std::vector<int> v = {5, 3, 1, 4, 2};56// Базовая сортировка7std::sort(v.begin(), v.end()); // [1, 2, 3, 4, 5]89// Сортировка по убыванию10std::sort(v.begin(), v.end(), std::greater<int>()); // [5, 4, 3, 2, 1]1112// Сортировка по критерию13struct Person {14 std::string name;15 int age;16};1718std::vector<Person> people = {{"Alice", 30}, {"Bob", 25}, {"Charlie", 35}};19std::sort(people.begin(), people.end(), [](const Person& a, const Person& b) {20 return a.age < b.age;21});
▸Поиск
1std::vector<int> v = {1, 2, 3, 4, 5};23// Линейный поиск4auto it = std::find(v.begin(), v.end(), 3);5if (it != v.end()) {6 std::cout << "Found: " << *it << "\n";7}89// Бинарный поиск (требует сортировки)10bool found = std::binary_search(v.begin(), v.end(), 3);1112// Поиск диапазона13auto [lower, upper] = std::equal_range(v.begin(), v.end(), 3);
▸Преобразование
1std::vector<int> v = {1, 2, 3, 4, 5};2std::vector<int> result(5);34// transform — применение функции к каждому элементу5std::transform(v.begin(), v.end(), result.begin(),6 [](int x) { return x * x; });7// result: [1, 4, 9, 16, 25]89// copy10std::copy(v.begin(), v.end(), result.begin());1112// replace13std::replace(result.begin(), result.end(), 3, 30);
▸Аккумуляция
1#include <numeric>23std::vector<int> v = {1, 2, 3, 4, 5};45// Сумма6int sum = std::accumulate(v.begin(), v.end(), 0);78// Произведение9int product = std::accumulate(v.begin(), v.end(), 1, std::multiplies<int>());1011// Сумма квадратов12int sum_sq = std::accumulate(v.begin(), v.end(), 0,13 [](int acc, int x) { return acc + x * x; });
Заголовок `<numeric>`
1#include <numeric>23std::vector<int> v = {1, 2, 3, 4, 5};45// inner product6int ip = std::inner_product(v.begin(), v.end(), v.begin(), 0);78// partial sum9std::vector<int> partial(5);10std::partial_sum(v.begin(), v.end(), partial.begin());11// partial: [1, 3, 6, 10, 15]1213// iota — заполнение последовательностью14std::vector<int> seq(5);15std::iota(seq.begin(), seq.end(), 1);16// seq: [1, 2, 3, 4, 5]
Заголовок `<ranges>` (C++20)
1#include <ranges>2#include <vector>34std::vector<int> v = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};56// Фильтрация и преобразование7auto result = v8 | std::views::filter([](int x) { return x % 2 == 0; })9 | std::views::transform([](int x) { return x * x; });1011for (int x : result) {12 std::cout << x << " "; // 4 16 36 64 10013}
Полезные алгоритмы
▸Удаление дубликатов
1std::vector<int> v = {1, 2, 2, 3, 3, 3};2auto last = std::unique(v.begin(), v.end());3v.erase(last, v.end());4// v: [1, 2, 3]
▸Проверка условия
1std::vector<int> v = {2, 4, 6, 8};2bool all_even = std::all_of(v.begin(), v.end(),3 [](int x) { return x % 2 == 0; }); // true45bool any_odd = std::any_of(v.begin(), v.end(),6 [](int x) { return x % 2 != 0; }); // false
▸Подсчёт
1int count = std::count_if(v.begin(), v.end(),2 [](int x) { return x > 5; });
Заключение
STL-алгоритмы — это основа эффективного C++-кодирования. Онипредоставляют производительные, протестированные решения для распространённых задач. Используйте их вместо ручных циклов для более чистого и надёжного кода.