2.2. Алгоритм foreach

Мы можем использовать алгоритм for_each для вызова функции с каждым из элементов последовательности в качестве аргумента. Вот программа, которая демонстрирует это:

//  for_each.cpp:  Алгоритм for_each. #include <iostream> #include <algorithm>

using namespace std;

void display(int x) {    static int  i=0;

cout «  "a["  « i++ «  "]   =  "  « x « endl; }

int main()

{    const  int N =  4;

Подсчет

55

int a[N]   =

{1234,   5432,   8943,   3346}; for_each(a,   a+N,   display); return 0; }

Эта программа работает точно так же, как если бы мы заменили вызов foreach следующим оператором for.

tor   (int  *р=а;   р   !=  a+N;   p++) display(*p);

В любом случае программа выведет

а[0]  =   1234

а[1]  =   5432

а[2]  =   8943

а[3]  =   3346

Функция display в этом примере обладает существенным недостатком: пере­менная i равна нулю только тогда, когда эта функция вызывается в первый раз. Например, еще один такой же вызов for_each в функции main приведет к ошибке, поскольку при повторном вызове функция display не начнет с i = 0. Мы можем решить эту проблему с помощью функционального объекта. За­меним функцию display следующим определением класса:

class display { public:

display!): i(0){)

void operator()(int x)

{    cout  «   "a[n   «  i++ «"]="« x «  endl;

} private:

int  i ; };

Также добавим пару скобок к третьему аргументу for each:

for_each(a,   a+N,  display!));

С этими изменениями программа выдаст прежние результаты. В отличие от первоначальной программы этот вывод будет повторен дважды, если мы напишем два вызова for_each.


<< назад вперед >>