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