Программирование >>  Операторы преобразования типа 

1 ... 99 100 101 [ 102 ] 103 104 105 ... 239


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

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

Таблица 9.1. Немодифицирующие алгоритмы

Название

Описание

Страница

for each()

Выполняет операцию с каждым элементом

count()

Возвращает количество элементов

counUfO

Возвращает количество элементов, удовлетворяющих заданному критерию

min element()

Возвращает элемент с минимальным значением

max elementO

Возвращает злемент с максимальным значением

findO

Ищет первый элемент с заданным значением

findJfO

Ищет первый элемент, удовлетворяющий заданному критерию

search n()

Ищет первые п последовательных элементов с заданными свойствами

search 0

Ищет первое вхождение подинтервала

find end()

Ищет последнее вхождение подинтервала

find first of()

Ищет первый из нескольких возможных элементов

adjacent find()

Ищет два смежных элемента, равных по заданному критерию

equal 0

Проверяет, равны ли два интервала

mismatchQ

Возвращает первый различающийся элемент в двух интервалах

1 exicog ra p hi ca Lcom pa re()

Проверяет, что один интервал меньше другопэ по лексикографическому критерию

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



Некоторые немодифицирующие алгоритмы предназначены для поиска элементов. К сожалению, имена поисковых алгоритмов выглядят недостаточно логично, к тому же оии отличаются от имен аналогичных строковых функций (табл. 9.2). Как это часто бывает, путаница возникла по историческим причинам. Во-первых, STL и строковые классы проектировались независимо друг от друга. Во-вторых, алгоритмы fincl encl(), fincl first of() и search n() не входили в исходную версию STL. Например, имя find end() вместо search end() было выбрано случайно (занимаясь деталями, легко упустить некоторые аспекты общей картины, например логическую согласованность). Также случайно выяснилось, что форма search n() нарушает общие концепции исходной версии STL. Проблема описана на с. 344.

Таблица 9.2. Сравнение строковых функций и алгоритмов поиска Поиск

Строковая функция

Алгоритм STL

Первое вхождение одного элемента

nnd()

fIndO

Последнее вхождение одного элемента

tfindQ

find() с обратным итератором

Первое вхождение подинтервала

findO

search()

Последнее вхождение подинтервала

tfindO

find end()

Первое вхождение нескольких элементов

find first of()

findJ1rst of()

Последнее вхождение нескольких элементов

nndJast of()

find first of() с обратным итератором

Первое вхождение п последовательных элементов

search n()

Модифицирующие алгоритмы

Модифицирующие алгоритмы изменяют значения элементов. Модификация производится непосредственно внутри интервала или в процессе копирования в другой интервал. Если элементы копируются в приемный интервал, исходный интервал остается без изменений. В табл. 9.3 перечислены модифицирующие алгоритмы стандартной библиотеки C-I-+.

Таблица 9.3. Модифицирующие алгоритмы

Название

Описание

Страиица

for each()

Выполняет операцию с каждым элементом

соруО

Копирует интервал начиная с первого элемента

copy backwards()

Копирует интервал, начиная с последнего элемента

transformO

Модифицирует (и копирует) элементы; объединяет

элементы двух интервалов

mergeO

Производит слияние двух интервалов

swap ranges()

Меняет местами элементы двух интервалов



Название

Описание

Страница

nilQ

filLnO

generateO

generate n()

replaceO

replacejf0

replace copy()

repi асессору Jf()

Заменяет каждый элемент заданным значением Заменяет п элементов заданным значением Заменяет каждый элемент результатом операции Заменяет п элементов результатом операций

366 Збб 368 368

Заменяет элементы с заданным значением другим значением 369

Заменяет элементы, соответствующие критерию, заданным 369 значением

Заменяет элементы с заданным значением при копировании 370 интервала

Заменяет элементы, соответствующие критерию, 370

при копировании интервала

В группе модифицирующих алгоритмов цен1ральное место занимают алгоритмы for each() (снова) и transform(). Оба алгоритма используются для модификации элементов последовательиостн, однако работают они по-разному.

О Алгоритму for each() передается операция, которая модифицирует его аргумент. Это означает, что аргумент должен передаваться по ссылке. Пример;

void square (int& elem) {

elem = elem * elem;

Передача no ссылке

Прямое присваивание вычисленного значения

for each(coll .beginO. coll.endO. Интервал square); Операция

О Алгоритм transform() использует операцию, которая возвращает модифицированный аргумент. Результат присваивается исходному э.тементу. Пример:

void square (int elem) Передача по значению {

return elem * elem: Возврат вычисленного значения

for each(coll .beginO. coll.endO. Источник coll,beginO. Приемник

square): Операция

Алгоритм transformO работает чуть медленнее, потому что требует воэвраще-ния и присваивания результата вместо прямой модификации элемента. С другой стороны, этот подход более гибок, поскольку он также может использоваться для модификации элементов в процессе копирования в другой интервал. Кроме того, у алгоритма transformO есть еще одна версия, которая позволяет обрабатывать и комбинировать элементы из двух разных интервалов.

Строго говоря, алгоритм merge() мог бы и не входить в список модифицирующих алгоритмов. Он требует сортировки своих интервалов-источников, поэтому



1 ... 99 100 101 [ 102 ] 103 104 105 ... 239

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика