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

1 ... 91 92 93 [ 94 ] 95 96 97 ... 239


и увеличивает его. Начальное значение счетчика передается в аргументе конструктора.

Два таких объекта функции используются алгоритмалш 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>



1 ... 91 92 93 [ 94 ] 95 96 97 ... 239

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