|
Программирование >> Немодифицирующие последовательные алгоритмы
Первый и второй аргументы алгоритма accumulate указывают последовательность, сумму элементов которой мы хотим вычислить. Третий аргумент задает начальное значение для процесса суммирования и, следовательно, обычно равен нулю. При первом вызове accumulate мы могли бы использовать константу О вместо переменной 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>() аналогичен рассмотренному в конце раздела 1.12 шаблону greater<int>(). Мы используем его для вычисления произведения вместо суммы: ассиш2.срр: Вычисление произведения, ♦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 (= 1x2x 10x5x3). В этом примере существенно, что третий аргумент алгоритма равен 1 (это идентичное или нейтральное значение для умножения). Четвертый аргумент указывает, что будет вычисляться целочисленное произведение. Снова обратимся к алгоритму accumulate, на этот раз используя наш собственный функциональный объект. Для заданного массива а, содержащего, скажем, четыре элемента, вычисляется следующее значение: 1 * а[0] + 2 * а[1] + 4 * а[2] + 8 * а[3] Кроме функции operatorQ наш функциональный объект содержит член типа int, который хранит последовательные степени 1,2,4 и 8, а также конструктор для инициализации этого члена класса: асситЗ .срр: Вычисление следующей суммы: 1 * а[0] + 2 * а[1] + 4 * а[2] + 8 * а[3]. #include <iostream> #include <numeric> using namespace std; class fun { public: fun(){i = 1;} int operator!)(int x, int y) { int u = X + i * y; i *= 2; return u; private: int i; int main() { const int N = 4; int a[N] = {7, 6, 9, 2}, prod = 0; prod = accumulate(a, a+N, prod, fun()); cout prod endl; return 0; Эта программа выведет значение 71 (= 1x7 + 2x6 + 4x9 + 8x2). 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 mainO { const int N = 4; int a[N] = {1234, 5432, 8943, 3346}; for each(a, a+N, display); return 0; Эта программа работает точно так же, как если бы мы заменили вызов foreach следующим оператором for. for (int *р=а; р != a+N; р++) display(*р); В любом случае программа выведет а[0] = 1234 а[1] = 5432 а[2] = 8943 а[3] = 3346 Функция display в этом примере обладает существенным недостатком: переменная i равна нулю только тогда, когда эта функция вызывается в первый раз. Например, еще один такой же вызов for each в функции main приведет к ошибке, поскольку при повторном вызове функция display не начнет с г = 0. Мы можем решить эту проблему с помощью функционального объекта. Заменим функцию display следующим определением класса: class display { public: displayO : i(0) {} void operator0 (int x) { cout a[ i++ ]= x endl; } private: int i; Также добавим пару скобок к третьему аргументу for each: for each(a, a+N, displayO); С этими изменениями программа выдаст прежние результаты. В отличие от первоначальной программы этот вывод будет повторен дважды, если мы напишем два вызова for each. 2.3. Подсчет Алгоритм count подсчитывает, какое количество элементов последовательности равно заданному значению. Давайте используем этот алгоритм для того, чтобы подсчитать, сколько раз в строке встречается буква е.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |