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

1 ... 37 38 39 [ 40 ] 41 42 43 ... 239


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); к каждому элементу



1 ... 37 38 39 [ 40 ] 41 42 43 ... 239

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