|
Программирование >> Операторы преобразования типа
for each(coll .begmO. coll.endO. Интервал addlO): Операция Если возможны разные приращения, известные па стадии компиляции, функция оформляется в виде нщблона: template <int theValuG> void add (lnt& elein) elem +- theValue; void flO { vector<int> coll: for Gach(coll .beginO. coll.endO. Интервал add<10>): Операция Ho если приращение определяется только во время выполнения программы, ситуация усложняется. Значение должно быть передано функции перед ее вызовом. Обычно в таких случаях применяется глобальная переменная, используемая как функцией, вызывающей алгоритм, так и функцией, вызываемой алгоритмом для суммирования. Программа получается неряшливой и запутанной. Если функция вызывается дважды с двумя разными приращениями, оба из которых становятся известными только во время выполнения, такая задача в принципе не решается одной обычной функцией. Прттходится либо передавать функции дополнительный признак, либо писать две разные функции. Вам когда-нибудь приходилось копировать определение функции, потому что ее состояние хранилось в статической переменной, а вам требовалась та же функция, но с другим состоянием? Наша проблема в точности аналогична этой. Допустим, требуется увеличить значения всех элементов коллекции на некоторую величину. Если приращение иэвесттю на стадии компиляции, можно воспользоваться обычной функцией: void addlO (int& olem) elem += 10: void no vector<lnt> coll; Объект функции позволяет написать умную функцию, которая ведет себя нужпым образом. Поскольку объект обладает состоянием, мы можем инициализировать его правильным приращением. Ниже приведен полный код примера: stl/addl.cpp #1nclude <1ostream> #1nclude <11st> #1nclude <algor1thi]i> Iinclude print.hpp using namespace std: Объект функции прибавляет к значению элемента приращение. заданное при его инициализации class AddValue { private: int theValue; Приращение public; Конструктор инициализирует приращение AddValuednt v) ; theValue(v) { Суммирование выполняется вызовом функции для элемента void operatorO (int& elem) const { elem += theValue; int mainO { llSt<int> coll; Вставка злементов со значениями от 1 до 9 for (int 1=1: 1<=9; ++1) { coll,push back(i): PRINTJLEMENTS (col 1, 1 n1 ti a 11 zed: ); Прибавить к каждому элементу 10 for each (coll .beginO, coll.endO. Интервал AddValue(lO)): Операция PRINT ELEMENTS(coll. after adding 10: ); Прибавить к каждому элементу значение первого элемента Вспомогательная функция PRINTELEMENTS() предсгааепа па с. 128. for each (coll.beginO. coll.endO. Интервал AddValue(*coll ,beginO)); Операция PRINTJLEMENTS(coll . after adding first elernent: ); После инициализации коллекция содержит числа от 1 до 9: initialized: 123456789 Первый вызов for each() увеличивает каждый элемент на 10: for each (coll.beginO. coll.endO. Интервал AddValueClO)); Операция Выражение AddValue(lO) создает объект типа AddValue и инициализирует его значением 10. Конструктор AddValue сохраняет это значение в переменной theValue. Во время работы for each() для каждого элемента соН вызывается оператор (). Еще раз стоит уточнить, что речь идет о вызове оператора () для переданного временного объекта функции типа AddValue. Сам элемент передается в аргументе. Объект функции увеличивает каждый элемент на 10. В результате содержимое коллекции выглядит так: aftor adding 10; 11 12 13 14 15 16 17 18 19 Второй вызов for each() тем же способом прибавляет значение первого элемента к каждому элементу коллекции. При этом временный объект функции AddValue инициализируется первым элементом коллекции: AddValue(*coll.beginO) На этот раз результат выглядит так: after adding first element: 22 23 24 25 26 27 28 29 30 На с. ЗЗА приведена измененная версия этого примера, в которой объект функции AddValue оформлен в виде шаблона для типа прибавляемого значения. Применение этой методики решает проблему одновременного существования двух состояний одной функции. Например, можно просто oбъявvlть два объекта функции и использовать их независимо друг от друга: AddValuG addx(x): Объект функции, прибавляющий значение х AddValue addx(y); Объект функции, прибавляющий значение у for each (col 1.boglnC), coll.endO. Прибавленио значения х addx); к каждому элементу for each (coll.beginO. coll.endO. Прибавление значения у addy); к каждому элементу for each (coll.beginO. coll.endO. Прибавление значения х addx); к каждому элементу
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |