|
Программирование >> Операторы преобразования типа
и увеличивает его. Начальное значение счетчика передается в аргументе конструктора. Два таких объекта функции используются алгоритмалш generate() и generate n(), записывающими сгенерированные зиачештя в коллекцию. Выражение IntSequence(l) в следующей комавде создает объект функции, инициализированный значением 1; generate n (back 1nserter(coll). 9. IntSequenceCD); Алгоритм generate(n) использует его девять раз для записи элемента, поэтому объект генерирует значения от 1 до 9. Аналогично, выражение IntSequence(42) генерирует последовательность, начиная со значения 42. Алгоритм generate() заменяет элементы, начиная с ++coll.begin() и заканчивая -coll.end()4 Результат выполнения программы выглядит так: 1234567В9 1 42 43 44 45 46 47 48 9 Используя другие версии оператора (), вы сможете легко строить более сложные последовательности. Объекты функций передаются по значению, а пе по ссылке. Следовательно, алгоритм не изменяет состояния объекта функции. Например, следующий код генерирует последовательность, начинающуюся со значения 1, дважды: IntSequence seqCl): Серия целых чисел, начинающаяся с 1 Вставка последовательности, начинающейся с 1 generate n (back inserterCcoll). 9, seq): Повторная вставка последовательности, начинающейся с 1 generate n (back inserter(coll), 9. seq); Передача объектов функций по значению, а не по ссылке, хороща тем, что позволяет передавать константы и временные выражения. В противном случае передача конструкции Int5equence(l) было бы невозможна. Впрочем, у передачи объектов функций по значению есть и недостатки: такая передача не позволяет учесть изменения в состоянии объекта. Алгоритм может изменить состояние объекта функции, однако вам не удастся получить итоговое состояние и обработать его в программе, потому что алгоритм создает внутреннюю копию объекта функции. Но что делать, если вам все-таки необходимо получить результат* от алгоритма? Существуют два способа получения результата при использовании объектов функций алгоритмами: О передача объекта функции но ссылке; О использование возвращаемого значения алгоритма for each() (см. с. 301). Возможно, выражения ++coll.begin() и -coll.endO не будут работать с векторами. Эта неприятная проблема обсуждается на с. 264. Чтобы передать объект функции по ссылке, достаточно уточнить вызов алгоритма так, чтобы тип объекта функции представлял собой ссылку Пример: fo/genera2.cpp Iinclude <iostrearn> #include <li5t> #include <algor ithin> #include print.hpp using namespace std; class IntSequence ( private: int value; public: Конструктор IntSequence (int initialValue) : value(initlalValue) { Вызов функции int operatorO О { return value++; int mainO list<int> coll: IntSequence seqCl); Серия целых чисел, начинающаяся с 1 Вставка значений от 1 до 4 - передача объекта функции по ссылке, чтобы при следующем вызове значения начинались с 5 generate n<back i nsert lterator<li st<i nt> >, int. IntSequence&>(back inserterCcoll). Начало 4, Количество злементов seq); Генератор значений, PRiNTJLEMENTSCcoll); Вставка значений от 42 до 45 generate n Cback inserter(coll). Начало 4. Количество элементов IntSequenceC42)); Генератор значений PRiNTJLEMENTSCcoll); Продолжение первой последовательности - передача объекта функции по ссылке. чтобы при следующем вызове значения снова начинапись с 5 Спасибо Филипу Кестеру (Philip Kiister), указавшему на эту возможность. generate n (bacl< lnserter(con). Начало 4. Количество элементов seq); Генератор значений PRINT ELEMENTS(coll): Снова продолжить первую последовательность generate n Cback 1nserter(co11). Начало 4. Количество элементов seq): Генератор значений PRINT ELEMENTS(con): Результат выполнения программы выглядит так: 12 3 4 1 2 3 4 42 43 44 45 1 2 3 4 42 43 44 45 5 6 7 8 1234 42 43 44 45 56785678 При первом вызове generate n() объект функции seq передается по ссылке, для чего производится уточнение аргументов шаблона: generate n<back insert 1terator<l1st<1nt> >. int. IntSeqLience&>(back inserter(coll). Начало 4. Количество элементов seq); Генератор значений В результате внутреннее значение seq изменяется после вызова, а второе использование seq при третьем вызове generate n() продолжает серию из первого вызова. Но на этот раз seq передается по значению, а не по ссылке: generate n (back 1nserterCcon). Начало 4. Количество элементов seq): Генератор значений Следовательно, вызов не изменяет внутреннего состояния seq, поэтому следующий вызов generate n() снова продолжает серию, начиная с 5. Возвращаемое значение алгоритма for each Благодаря алгоритму for each() хлопоты с реализацией объекта функции на базе подсчета ссылок для получения его итогового состояния оказываются излишними. Алгоритм for each() обладает уникальной особенностью - он возвращает свой объект функции (другие алгоритмы этого делать не могут). Это означает, что вы можете получить информацию о состоянии объекта функции, проверяя возвращаемое значение алгоритма for eacb(). Следующая программа хорошо поясняет, как использовать возвращаемое значение алгоритма for each(). В ней вычисляется среднее арифметическое числовой последовательности. fo/foreach3.cpp include <1ostream>
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |