< 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) Technical Specifications

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.

### Notes

If `first == last`, this function has no effect and will merely return `d_first`.

### Complexity

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

### Possible implementation

First version
```template<class InputIt, class OutputIt>
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 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```

 partial_sum computes the partial sum of a range of elements (function template) accumulate sums up a range of elements (function template) std::experimental::parallel::ajacent_difference (parallelism TS) parallelized version of `std::ajacent_difference` (function template)