adjacent_difference


Calculate and sum the difference between adjacent pairs of values.

Iterate through every element in the range [ first +1 ... last ) and write the difference between the element and its preceding element to result . Return an iterator equal to result + n , where
n = last - first . Assignment into the original range is permitted. The first version uses operator- to calculate the difference, whereas the second version uses the binary function binary_op .

Library

Standards<ToolKit>

Declaration


#include <numeric>

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,
  BinaryOperator binary_op
  );
  

Complexity

Time complexity is linear as operator- or binary_op are applied ( last - first - 1 ) times. Space complexity is constant.

Example <ospace/osstd/examples/adjdiff0.cpp>
#include <iostream>
#include <numeric>

int numbers[ 5 ] = { 1, 2, 4, 8, 16 };

void
main()
  {
  int difference[ 5 ];

  adjacent_difference( numbers, numbers + 5, difference );

  int i;
  for ( i = 0; i < 5; ++i )
    cout << numbers[ i ] << ` `;
  cout << "\n";
  for ( i = 0; i < 5; ++i )
    cout << difference[ i ] << ` `;
  cout << "\n";
  }

1 2 3 8 16
1 1 2 4 8
Example <ospace/osstd/examples/adjdiff1.cpp>
#include <iostream>
#include <iterator>
#include <vector>
#include <numeric>

void
main()
  {
  vector< int > v( 10 );
  for ( size_t i = 0; i < v.size(); ++i )
    v[ i ] = i * i;
  vector< int > result( v.size() );

  adjacent_difference( v.begin(), v.end(), result.begin() );

  ostream_iterator< int > iter( cout, " " );
  copy( v.begin(), v.end(), iter );
  cout << "\n";
  copy( result.begin(), result.end(), iter );
  cout << "\n";
  }

0 1 4 9 16 25 36 49 64 81
0 1 3 5 7 9 11 13 15 17
Example <ospace/osstd/examples/adjdiff2.cpp>
#include <iostream>
#include <iterator>
#include <vector>
#include <numeric>

int
mult( int a, int b )
  {
  return a * b;
  }

void
main()
  {
  vector< int > v( 10 );
  for ( size_t i = 0; i < v.size(); ++i )
    v[ i ] = i + 1;
  vector< int > result( v.size() );

  adjacent_difference( v.begin(), v.end(), result.begin(), mult );

  ostream_iterator< int > iter( cout, " " );
  copy( v.begin(), v.end(), iter );
  cout << "\n";
  copy( result.begin(), result.end(), iter );
  cout << "\n";
  }

1 2 3 4 5 6 7 8 9 10
1 2 6 12 20 30 42 56 72 90

Copyright©1994-2026 Recursion Software LLC
All Rights Reserved - For use by licensed users only.