Шаг 256.
Библиотека STL.
Алгоритмы STL. Немодифицирующие алгоритмы

    На этом шаге мы рассмотрим немодифицирующие алгоритмы.

    Немодифицирующие алгоритмы сохраняют как порядок следования обрабатываемых элементов, так и их значения. Они работают с итераторами ввода и прямыми итераторами и поэтому могут вызываться для всех стандартных контейнеров. В таблице 1 перечислены алгоритмы стандартной библиотеки STL, не изменяющие состояния контейнера.

Таблица 1. Немодифицирующие алгоритмы
Название Описание
for_each() Выполняет операцию с каждым элементом
count() Возвращает количество элементов
count_if() Возвращает количество элементов, удовлетворяющих заданному критерию
min_element() Возвращает элемент с минимальным значением
max_element() Возвращает элемент с максимальным значением
find() Ищет первый элемент с заданным значением
find_if() Ищет первый элемент, удовлетворяющий заданному критерию
search_n() Ищет первые n последовательных элементов с заданными свойствами
search() Ищет первое вхождение подинтервала
find_end() Ищет последнее вхождение подинтервала
find_first_of() Ищет первый из нескольких возможных элементов
adjacent_find() Ищет два смежных элемента, равных по заданному критерию
equal() Проверяет, равны ли два интервала
mismatch() Возвращает первый различающийся элемент в двух интервалах
lexicographical_compare() Проверяет, что один интервал меньше другого по лексикографическому критерию

    Один из важнейших алгоритмов for_each() для каждого элемента вызывает операцию, переданную при вызове. Обычно операция выполняет некоторую обработку на уровне отдельных элементов. Например, при вызове for_each() можно передать функцию, которая выводит значение элемента. Кроме того, алгоритм for_each() позволяет вызвать для каждого элемента модифицирующую операцию. Следовательно, for_each() можно отнести как к модифицирующим, так и к немодифицирующим алгоритмам. Впрочем, старайтесь по возможности вместо for_each() использовать другие алгоритмы, реализованные специально для конкретных задач.

    Некоторые немодифицирующие алгоритмы предназначены для поиска элементов. К сожалению, имена поисковых алгоритмов выглядят недостаточно логично, к тому же они отличаются от имен аналогичных строковых функций (таблица 2). Как это часто бывает, путаница возникла по историческим причинам. Во-первых, STL и строковые классы проектировались независимо друг от друга. Во-вторых, алгоритмы find_end(), find_first_of() и search_n() не входили в исходную версию STL. Например, имя find_end() вместо search_end() было выбрано случайно. Также случайно выяснилось, что форма search_n() нарушает общие концепции исходной версии STL.

Таблица 2. Сравнение строковых функций и алгоритмов поиска
Поиск Строковая функция Алгоритм STL
Первое вхождение одного элемента find() find()
Последнее вхождение одного элемента rfind() find() с обратным итератором
Первое вхождение подинтервала find() search()
Последнее вхождение подинтервала rfind() find_end()
Первое вхождение нескольких элементов find_first_of() find_first_of()
Последнее вхождение нескольких элементов find_last_of() find_first_of() с обратным итератором
Первое вхождение n последовательных элементов   search_n()

    На следующем шаге мы рассмотрим модифицирующие алгоритмы.




Предыдущий шаг Содержание Следующий шаг