Другие алгоритмы и контейнеры

2.1. Алгоритм accumulate

Нахождение суммы элементов последовательности или подпоследователь­ности лучше всего достигается с помощью алгоритма accumulate. Этот алго­ритм вместе с некоторыми другими, которые имеют отношение к вычисле­ниям, определен в заголовке numeric, а не algorithm, как большинство остальных алгоритмов. (Если вы работаете с HP STL, то должны использо­вать algoh вместо algorithm или numeric.) Следующая программа показыва­ет, как использовать алгоритм accumulate для массива:

// accuml.cpp: Вычисление сумм. #include <iostream> #include <numeric> using namespace std;

int main()

{ const int N = 8;

int a[N] = {4, 12, 3, 6, 10, 7, 8, 5}, sum = 0;

sum = accumulate(a, a+N, sum);

cout « "Sum of all elements: " « sum « endl;

cout « "1000 + a[2] + a[3] + a[4] = "

« accumulate(a+2, a+5, 1000) « endl;

return 0; }

Первый и второй аргументы алгоритма accumulate указывают последова­тельность, сумму элементов которой мы хотим вычислить. Третий аргу­мент задает начальное значение для процесса суммирования и, следова­тельно, обычно равен нулю. При первом вызове accumulate мы могли бы использовать константу 0 вместо переменной sum в качестве третьего ар­гумента. Вот результат работы этой программы:

Sum of all elements:   55

1000 + a[2]   + a[3]   + a[4]   =  1019

Эти значения вычисляются как

0 + 4+12 + 3 + 6+10+ 7 + 8 + 5 = 55 1000 + 3 + 6+10= 1019

Шаблон multiplies<int>0 аналогичен рассмотренному в конце раздела 1.12 шаблону greater<int>(). Мы используем его для вычисления произведения вместо суммы:

// accum2.cpp:   Вычисление произведения, ♦include <iostream> #include <numeric> ♦include <algorithm> ♦include <functional>

using namespace  std;

int main()

{    const  int N =  4;

int  a[N]   =   {2,   10,   5,   3},   prod =  1;

prod = accumulate(a,   a+N,  prod,  multiplies<int>());

//   ('muliplies'   бывший   'times')

cout « "Product of all elements: " « prod « endl;

return 0; }

Заметим, что ранее шаблон назывался times, а не multiplies. Это по-прежнему так для ВС 5.2. Вывод программы составляет 300 (=1x2x10x5x3). В этом примере существенно, что третий аргумент алгоритма равен 1 (это «идентичное» или «нейтральное» значение для умножения). Четвертый ар­гумент указывает, что будет вычисляться целочисленное произведение.


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