|
Программирование >> Операторы преобразования типа
Вспомогательные функции В оставшейся части этой главы приводятся подробные описаиия всех алгоритмов. Для каждого алгоритма дается минимум один пример. Следующие вспомогательные функции упрощают код примеров, чтобы читатель мог сосредоточиться на наиболее содержательных аспектах: algo/algostuff,hpp #Tfndef ALGOSTUFF HPP fdefine ALGOSTUFF HPP finclude <iostream> finclude <vector> fmclude <deque> #1nclude <llst> #1nclude <set> include <map> #1nclude <string> #1nclude <algorithni> finclude <functional> #1nclude <numer1c> /* PRINTJLEMENTSO * - вывод необязательной строки С. за которой выводятся * - все злементы коллекции coll. разделенные пробелами. */ template <cla5s Т> inline void PRINTJLEMENTS (const T& coll, const char* optcstr= ) { typename T::const 1terator pos: std::cout optcstr: for (pos-col1.beginO: pos!=coll,end(): ++pos) { std::cout *pos ; std: xout std;:endl; /* INSERTJLEMENTS (collection, first, last) * - заполнение коллекции значениями от first до last * - ВНИМАНИЕ; интервал НЕ ЯВЛЯЕТСЯ полуоткрытым */ template <class Т> inline void INSERTJLEMENTS (Т& coll. int first, int last) { for (1nt 1=first; 1<=last: ++i) { coll лnsert(coll .endO .1): #endif /*ALGOSTUFF HPP*/ Сначала в файл agostuff.hpp включаются все заголовочные файлы, которые могут быть задействованы в примерах, чтобы их не пришлось включать отдельно. Затем определяются две вспомогательные функции. О Функция PRINT ELEMENTS() выводит все элементы контейнера, переданного в первом аргументе, разделяя их пробелами. Второй необязательный аргумент определяет префикс - строку, которая будет выводиться перед элементами (см. с. 128). О Функция INSERT ELEMENTS() вставляет элементы в контейнер, переданный в первом аргументе. Элементам присваиваются значения в интервале, гратш-цы которого определяются вторым и третьим аргументами. В данном случае включаются оба аргумента (поэтому интервал не является полуоткрытым). Алгоритм for each Алгоритм for each() обладает чрезвычайно гибкими возможностями. С его помощью можно производить разнообразную обработку и модификацию каждого элемента. UnaryProc for each (Inputlterator beg. Inputlterator end, UnaryProc op) О Вызывает унарный предикат op{elem) для каждого элемента elem в интервале [beg,end). О Возвращает копию ор (измененную в процессе выполнения). О Операция ор может модифицировать элементы. На с. 325 алгоритм for each() сравнивается с алгоритмом transformO. который решает ту же задачу, но несколько иным способом. О Возвращаемые значения ор игнорируются. О Реализация алгоритма for each() приведена на с. 135. О Сложность линейная (numberOfElements вызовов ор). В следующем примере алгоритм for each() вызывает для каждого элемента функцию print(), которая выводит текущее значение элемента. algo/foreachl.cpp #lnclude algostuff.hpp using namespace std: Функция, вызываемая для каждого элемента void print (int elem) cout elem : int mainO { vector<int> coll: INSERT ELEMENTS(coll.l.9): call printO for each element for each (coll,beginO. coll.endO. Интервал print): Операция cout endl: Программа выводит следующий результат: 123456789 Чтобы вызвать для каждого элемента функцию его класса, необходимо использовать адаптеры mem fun. За подробностями и примерами обращайтесь на с. 307. В следующем примере объект функции модифицирует элементы в процессе перебора: algo/foreach2.cpp #include algostuff.hpp using namespace std; Объект функции прибавляет к значению элемента приращение. заданное при его инициализации template <class Т> class AddValue { private: Т theValue: Приращение public: Конструктор инициализирует приращение AddValue (const Т& v) : theValue(v) { } Суммирование выполняется вызовом функции для элемента void operatorO (Т& elem) const { elem += theValue:
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |