|
Программирование >> Операторы преобразования типа
int mainO { vector<int> col 1; INSERT ELEMENTS(coll,1.9); Прибавить к каждому элементу 10 for each (coll.beginO. coll.endO. Интервал AddValue<int>(10)); Операция PRINT ELEMENTS(coll): Прибавить к каждому элементу значение первого злемента for each (coll.beginO, coll.endO. range Add\/alue<int>(*coll,beginO)); operation PRlNT ELEMENTS(coll): Класс AddValueO определяет объекты функций, которые прибавляют к каждому элементу приращение, переданное при вызове конструктора. Используя объект функции, вы сможете определить величину приращения на стадии выполнения программы. Результат выполнения программы выглядит так: 11 12 13 14 15 16 17 18 19 22 23 24 25 26 27 28 29 30 Подробное описание этого примера приведено на с. 138. Задача также решается при помощи алгоритма transform() (см. с. 363): transform (coll.beginO. coll.endO. Источник coll .beginO , Приемник bind2nd(plus<1nt>0.10)); Олерация transform (coll.beginO. coll.endO. Источник coll .beginO. Приемник bind2nd(plus<int>0 ,*coll .beginO)): Операция Ha c. 325 приведен общий сравнительный анализ алгоритмов for each() и transformO. В третьем примере используется значение, возвращаемое алгоритмом for each(). Особое свойство for each() - возвращение выполняемой операции - позволяет выполнить необходимые вычисления и вернуть результат в объекте функции. algo/foreachS.cpp #1nclude algostuff,hpp using namespace std; Объект функции для вычисления среднего арифметического class MeanValue { private: long num: Счетчик элементов long sum; Сумма всех значений элементов public: Конструктор MeanValue О : num(O) 5Ufn(0) { } Вызов функции - о&ра&отка очередного элемента последовательности void operator!) (Int elem) { num++; Увеличение счетчика sum += elem; Прибавление значения Возвращение среднего арифметического (с неявным преобразованием типа) operator doubleO { return static cast<double>(sum) / static cast<double>(num); int mainO { vector<int> coll: INSERT ELEMENTS(coll.l.8); Вычисление и вывод среднего арифметического double mv = for each (coll,beginO. coll.endO. Интервап MeanValueO): Операция cout mean value: mv endl; Программа выводит следующий результат: mean value: 4,5 Этот пример, хотя и в слегка измененной форме, подробно рассматривается иа с. 301. Немодифицирующие алгоритмы Алгоритмы, описанные в этом разделе, работают с элементами, не изменяя их значений или порядка следования. Подсчет элементов d1 f ference J:ype count (Inputlterator beg. Inputlterator end. const value) dlfference type count if (Inputlterator beg. Inputlterator end. UnaryPredicate op) О Первая форма подсчитывает элементы с заданным значением в интервале [begend). О Вторая форма подсчитывает в интервале [beg,end) элементы, для которых унарный предикат ор(е1.ет) возврашает true. О Тип возвращаемого значения difference tyре представляет тип разности итераторов: typename iterator tra1ts<lnputlterator>;:difference type Структура iterator traits описана на с. 288. О Предикат ор не должен изменять свое состояние во время вызова. За подробностями обращайтесь на с. 303. О Предикат ор не должен изменять передаваемые аргументы. О В классах ассоциативных контейнеров (множества, мультимножества, отображения и мультиотображения) определена похожая функция count() для подсчета элементов с заданным ключом (см. с. 239). О Сложность линейная (numberOfElements сравнений или вызовов ор соответственно). Пример подсчета элементов по разным критериям: algo/countl.cpp finclude algostuff.hpp using namespace std: bool IsEven (lnt elem) { return elem X 2 == 0: 1nt maln() vector<1nt> col 1: lnt num; lNSERT ELEMENTS(coll.1.9): PRINT ELEMENTS(coll. coll: ): Подсчет элементов со значением 4 num = count (coll.beginO. coll.endO. 4): cout number of elements equal to 4: Интервал Значение num endl; Подсчет четных элементов num = count if (coll.beginO. coll.endO. Интервал isEven); Критерий cout number of elements with even value: num endl: Подсчет элементов со значениями, большими 4 num = countjf (coll.beginO. coll.endO. Интервал b1nd2nd(greater<1nt>0,4)): Критерий
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |