Итераторы и алгоритмы STL
Зачем нужны алгоритмы
Стандартная библиотека предоставляет готовые алгоритмы для поиска, сортировки, подсчёта и преобразования диапазонов. Это уменьшает количество ручных циклов и делает намерение кода яснее.
#include <algorithm>#include <vector>std::vector<int> values{5, 1, 4, 2};std::sort(values.begin(), values.end());auto it = std::find(values.begin(), values.end(), 4);begin() обозначает начало диапазона, а end() — позицию сразу после последнего элемента. end() нельзя разыменовывать.
Итераторы
Итератор — объект, который обозначает элемент или позицию в последовательности. Разные контейнеры поддерживают разные операции с итераторами. Например, у vector есть произвольный доступ, а у list нет доступа по индексу за константное время.
Предикаты
Многие алгоритмы принимают функцию или лямбда-выражение:
auto count = std::count_if(values.begin(), values.end(), [](int value) { return value > 2; });Лямбда здесь возвращает true, если элемент больше двух.
Удаление элементов
До C++20 часто использовался идиоматический erase-remove:
values.erase( std::remove(values.begin(), values.end(), 2), values.end());remove перемещает сохраняемые элементы в начало диапазона и возвращает новую логическую границу, но сам контейнер не уменьшает. erase действительно удаляет хвост. В C++20 для стандартных контейнеров доступен std::erase(values, 2).
Алгоритмы и контейнеры
Не изменяй контейнер внутри алгоритма так, чтобы инвалидировать используемые итераторы, если алгоритм этого не предусматривает. Проверяй требования алгоритма к типу итератора и операции сравнения.
Итог
Сначала ищи подходящий алгоритм STL, а не пиши цикл вручную. Алгоритмы выражают намерение, проверены и часто лучше оптимизируются компилятором.
