Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Липпман.doc
Скачиваний:
8
Добавлен:
14.08.2019
Размер:
7.54 Mб
Скачать

Алгоритм accumulate()

template < class InputIterator, class Type >

Type accumulate(

InputIterator first, InputIterator last,

Type init );

template < class InputIterator, class Type,

class BinaryOperation >

Type accumulate(

InputIterator first, InputIterator last,


Type init, BinaryOperation op );

Первый вариант accumulate() вычисляет сумму значений элементов последовательности из диапазона, ограниченного парой итераторов [first,last), с начальным значением, которое задано параметром init. Например, если дана последовательность {1,1,2,3,5,8} и начальное значение 0, то результатом работы алгоритма будет 20. Во втором варианте вместо оператора сложения к элементам применяется переданная бинарная операция. Если бы мы передали алгоритму accumulate() объект-функцию times<int> и начальное значение 1, то получили бы результат 240. accumulate() – это один из численных алгоритмов; для его использования в программу необходимо включить заголовочный файл <numeric>.

#include <numeric>

#include <list>

#include <functional>

#include <iostream.h>

/*

* выход:

* accumulate()

* работает с последовательностью {1,2,3,4}

* результат для сложения по умолчанию: 10

* результат для объекта-функции plus<int>: 10

*/

int main()

{

int ia[] = { 1, 2, 3, 4 };

list<int,allocator> ilist( ia, ia+4 );

int ia_result = accumulate(&ia[0], &ia[4], 0);

int ilist_res = accumulate(

ilist.begin(), ilist.end(), 0, plus<int>() );

cout << "accumulate()\n\t"

<< "работает с последовательностью {1,2,3,4}\n\t"

<< "результат для сложения по умолчанию: "

<< ia_result << "\n\t"

<< "результат для объекта-функции plus<int>: "

<< ilist_res

<< endl;

return 0;


}

Алгоритм adjacent_difference()

template < class InputIterator, class OutputIterator >

OutputIterator adjacent_difference(

InputIterator first, InputIterator last,

OutputIterator result );

template < class InputIterator, class OutputIterator >

class BinaryOperation >

OutputIterator adjacent_difference(

InputIterator first, InputIterator last,


OutputIterator result, BinaryOperation op );

Первый вариант adjacent_difference() создает новую последовательность, в которой значение каждого элемента, кроме первого, равно разности между текущим и предыдущим элементами исходной последовательности. Например, если дано {0,1,1,2,3,5,8}, то первым элементом новой последовательности будет копия: 0. Вторым – разность первых двух элементов исходной последовательности: 1. Третий элемент равен разности третьего и второго элементов: 1‑1=0, и т.д. В результате мы получим последовательность {0,1,0,1,1,2,3}.

Во втором варианте разность соседних элементов вычисляется с помощью указанной бинарной операции. Возьмем ту же исходную последовательность и передадим объект-функцию times<int>. Как и раньше, первый элемент просто копируется. Второй элемент – это произведение первого и второго элементов исходной последовательности; он тоже равен 0. Третий элемент – произведение второго и третьего элементов исходной последовательности: 1 * 1 = 1, и т.д. Результат – {0,1,2,6,15,40}.

В обоих вариантах итератор OutputIterator указывает на элемент, расположенный за последним элементом новой последовательности. adjacent_difference() – это один из численных алгоритмов, для его использования в программу необходимо включить заголовочный файл <numeric>.

#include <numeric>

#include <list>

#include <functional>

#include <iterator>

#include <iostream.h>

int main()

{

int ia[] = { 1, 1, 2, 3, 5, 8 };

list<int,allocator> ilist(ia, ia+6);

list<int,allocator> ilist_result(ilist.size());

adjacent_difference(ilist.begin(), ilist.end(),

ilist_result.begin() );

// на выходе печатается:

// 1 0 1 1 2 3

copy( ilist_result.begin(), ilist_result.end(),

ostream_iterator<int>(cout," "));

cout << endl;

adjacent_difference(ilist.begin(), ilist.end(),

ilist_result.begin(), times<int>() );

// на выходе печатается:

// 1 1 2 6 15 40

copy( ilist_result.begin(), ilist_result.end(),

ostream_iterator<int>(cout," "));

cout << endl;


}