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.
<< назад вперед >>