Другие алгоритмы и контейнеры
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 (это «идентичное» или «нейтральное» значение для умножения). Четвертый аргумент указывает, что будет вычисляться целочисленное произведение.
<< назад вперед >>