< cpp‎ | algorithm

C++
 Language Standard library headers Concepts Utilities library Strings library Containers library Algorithms library Iterators library Numerics library Input/output library Localizations library Regular expressions library (C++11) Atomic operations library (C++11) Thread support library (C++11)

Algorithm library
Functions
Non-modifying sequence operations
 all_ofany_ofnone_of (C++11)(C++11)(C++11) for_each countcount_if mismatch equal
Modifying sequence operations
 copycopy_if (C++11) copy_n (C++11) copy_backward move (C++11) move_backward (C++11) fill fill_n transform generate generate_n removeremove_if remove_copyremove_copy_if
Partitioning operations
 is_partitioned (C++11) partition partition_copy (C++11)
 stable_partition partition_point (C++11)
Sorting operations (on sorted ranges)
 is_sorted (C++11) is_sorted_until (C++11) sort
Binary search operations (on sorted ranges)
Set operations (on sorted ranges)
Heap operations
 is_heap (C++11) is_heap_until (C++11) make_heap
Minimum/maximum operations
 max max_element min min_element minmax (C++11) minmax_element (C++11)
Numeric operations
 iota (C++11) accumulate inner_product
C library

 Defined in header template< class InputIt, class OutputIt > OutputIt adjacent_difference( InputIt first, InputIt last,                                     OutputIt d_first ); (1) template< class InputIt, class OutputIt, class BinaryOperation > OutputIt adjacent_difference( InputIt first, InputIt last,                                     OutputIt d_first,                                     BinaryOperation op ); (2)

Computes the differences between the second and the first of each adjacent pair of elements of the range [first, last) and writes them to the range beginning at d_first + 1. Unmodified copy of first is written to d_first. The first version uses operator- to calculate the differences, the second version uses the given binary function op.

Equivalent operation:

*(d_first)   = *first;
*(d_first+1) = *(first+1) - *(first);
*(d_first+2) = *(first+2) - *(first+1);
*(d_first+3) = *(first+3) - *(first+2);
...
 op must not have side effects. (until C++11) op must not invalidate any iterators, including the end iterators, or modify any elements of the ranges involved. (since C++11)

## Contents

### Parameters

 first, last - the range of elements d_first - the beginning of the destination range op - binary operation function object that will be applied. The signature of the function should be equivalent to the following:  Ret fun(const Type1 &a, const Type2 &b); The signature does not need to have const &. The types Type1 and Type2 must be such that an object of type iterator_traits::value_type can be implicitly converted to both of them. The type Ret must be such that an object of type OutputIt can be dereferenced and assigned a value of type Ret. ​ Type requirements - InputIt must meet the requirements of InputIterator. - OutputIt must meet the requirements of OutputIterator.

### Return value

It to the element past the last element written.

### Complexity

Exactly (last - first) - 1 applications of the binary operation

### Possible implementation

First version
template<class InputIt, class OutputIt>
OutputIt adjacent_difference(InputIt first, InputIt last,
OutputIt d_first)
{
if (first == last) return d_first;

typedef typename std::iterator_traits<InputIt>::value_type value_t;
value_t acc = *first;
*d_first = acc;
while (++first != last) {
value_t val = *first;
*++d_first = val - acc;
acc = std::move(val);
}
return ++d_first;
}
Second version
template<class InputIt, class OutputIt, class BinaryOperation>
OutputIt adjacent_difference(InputIt first, InputIt last,
OutputIt d_first, BinaryOperation op)
{
if (first == last) return d_first;

typedef typename std::iterator_traits<InputIt>::value_type value_t;
value_t acc = *first;
*d_first = acc;
while (++first != last) {
value_t val = *first;
*++d_first = op(val, acc);
acc = std::move(val);
}
return ++d_first;
}

### Example

The following code converts a sequence of even numbers to repetitions of the number 2 and converts a sequence of ones to a sequence of Fibonacci numbers.

#include <numeric>
#include <vector>
#include <iostream>
#include <functional>

int main()
{
std::vector<int> v{2, 4, 6, 8, 10, 12, 14, 16, 18, 20};

for (auto n : v) {
std::cout << n << ' ';
}
std::cout << '\n';

v = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
std::adjacent_difference(v.begin(), v.end() - 1, v.begin() + 1, std::plus<int>());

for (auto n : v) {
std::cout << n << ' ';
}
std::cout << '\n';
}

Output:

2 2 2 2 2 2 2 2 2 2
1 1 2 3 5 8 13 21 34 55