Алгоритм adjacent_difference()

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

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

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

#include numeric

#include list

#include functional

#include iterator

#include iostream.h

int main()

{

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

listint,allocator ilist(ia, ia+6);

listint,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_iteratorint(cout," "));

cout endl;

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

ilist_result.begin(), timesint() );

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

// 1 1 2 6 15 40

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

ostream_iteratorint(cout," "));

cout endl;

}

Алгоритм adjacent_find()

template class ForwardIterator

ForwardIterator

adjacent_find( ForwardIterator first, ForwardIterator last );

template class ForwardIterator, class BinaryPredicate

ForwardIterator

adjacent_find( ForwardIterator first,

ForwardIterator last, Predicate pred );

adjacent_find() ищет первую пару одинаковых соседних элементов в диапазоне, ограниченном итераторами [first,last). Если соседние дубликаты найдены, то алгоритм возвращает однонаправленный итератор, указывающий на первый элемент пары, в противном случае возвращается last. Например, если дана последовательность {0,1,1,2,2,4}, то будет найдена пара [1,1] и возвращен итератор, указывающий на первую единицу.

#include algorithm

#include vector

#include iostream.h

#include assert.h

class TwiceOver {

public:

bool operator() ( int val1, int val2 )

{ return val1 == val2/2 ? true : false; }

};

int main()

{

int ia[] = { 1, 4, 4, 8 };

vector int, allocator vec( ia, ia+4 );

int *piter;

vector int, allocator ::iterator iter;

// piter указывает на ia[1]

piter = adjacent_find( ia, ia+4 );

assert( *piter == ia[ 1 ] );

// iter указывает на vec[2]

iter = adjacent_find( vec.begin(), vec.end(), TwiceOver() );

assert( *iter == vec[ 2 ] );

// пришли сюда: все хорошо

cout "ok: adjacent-find() завершился успешно! ";

return 0;

}