На этом шаге мы рассмотрим немодифицирующие алгоритмы.
Немодифицирующие алгоритмы сохраняют как порядок следования обрабатываемых элементов, так и их значения. Они работают с итераторами ввода и прямыми итераторами и поэтому могут вызываться для всех стандартных контейнеров. В таблице 1 перечислены алгоритмы стандартной библиотеки STL, не изменяющие состояния контейнера.
| Название | Описание | 
|---|---|
| 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.
| Поиск | Строковая функция | Алгоритм 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() | 
На следующем шаге мы рассмотрим модифицирующие алгоритмы.