std::adjacent_difference

From Cppreference

Jump to: navigation, search
Defined in header <numeric>

template< class InputIterator, class OutputIterator >

OutputIterator adjacent_difference( InputIterator first, InputIterator last,

                                    OutputIterator d_first );
(1)
template< class InputIterator, class OutputIterator, class BinaryOperation >

OutputIterator adjacent_difference( InputIterator first, InputIterator last,
                                    OutputIterator 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);
...

Contents

[edit] 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<InputIterator>::value_type can be implicitly converted to both of them. The type Ret must be such that an object of type OutputIterator can be dereferenced and assigned a value of type Ret. ​

[edit] Return value

Iterator to the element past the last element written.

[edit] Complexity

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

[edit] Equivalent function

[edit] 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};
    std::adjacent_difference(v.begin(), v.end(), v.begin());
 
    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

[edit] See also

partial_sum
computes the partial sum of a range of elements
(function template)
accumulate
sums up a range of elements
(function template)