С++ для начинающих


Алгоритм 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;

}



Содержание раздела