```
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 binary_op);
```

*Effects:* For a non-empty range,
the function creates an accumulator acc whose type is InputIterator's
value type, initializes it with *first,
and assigns the result to *result. For every iterator i in [first + 1,last)
in order, creates an object val whose type is InputIterator's value type, initializes it
with *i, computes val - acc or binary_op(val, acc), assigns the result
to *(result + (i - first)), and move assigns from val to acc.

*Requires:*
InputIterator's value type shall be MoveAssignable (Table [moveassignable])
and shall be constructible from the type of *first. acc shall be
writable to the result output iterator. The result of the expression val - acc
or binary_op(val, acc) shall be writable to the result output iterator.
In the ranges
[first,last]
and
[result,result + (last - first)],
binary_op
shall neither modify elements nor invalidate iterators or
subranges.293

*Remarks:*
result
may be equal to
first.

*Returns:*
result + (last - first).

*Complexity:*
Exactly
(last - first) - 1
applications of
the binary operation.

The use of fully closed ranges is intentional.