|
Программирование >> Операторы преобразования типа
Немодифицирующие алгоритмы Немодифицирующие алгоритмы сохраняют как порядок следования обрабатываемых элементов, так и их значения. Они работают с итераторами ввода и прямыми итераторами и поэтому могут вызываться для всех стандартных контейнеров. В табл. 9.1 перечислены алгоритмы стандартной библиотеки STL, не изменяющие состояния контейнера. На с. 330 приведен список немодифици-рующих алгоритмов, предназначенных для упорядоченных входных интервалов. Таблица 9.1. Немодифицирующие алгоритмы
Один из важнейщих алгоритмов 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
Модифицирующие алгоритмы Модифицирующие алгоритмы изменяют значения элементов. Модификация производится непосредственно внутри интервала или в процессе копирования в другой интервал. Если элементы копируются в приемный интервал, исходный интервал остается без изменений. В табл. 9.3 перечислены модифицирующие алгоритмы стандартной библиотеки C-I-+. Таблица 9.3. Модифицирующие алгоритмы
Название Описание Страница 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() мог бы и не входить в список модифицирующих алгоритмов. Он требует сортировки своих интервалов-источников, поэтому
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |