Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
std::adjacent_difference(3)   C++ Standard Libary  std::adjacent_difference(3)

NAME
       std::adjacent_difference	- std::adjacent_difference

Synopsis
	  Defined in header <numeric>
	  template< class InputIt, class OutputIt >

	  OutputIt   adjacent_difference(  InputIt  first,		(until
       C++20)
	  InputIt last,

	  OutputIt d_first );
	  template< class InputIt, class OutputIt >

	  constexpr  OutputIt  adjacent_difference(  InputIt		(since
       C++20)
	  first, InputIt last,

	  OutputIt d_first );
	  template< class ExecutionPolicy, class
	  ForwardIt1, class ForwardIt2 >

	  ForwardIt2   adjacent_difference(			   (2)	(since
       C++17)
	  ExecutionPolicy&& policy, ForwardIt1 first,
	  ForwardIt1 last,

	  ForwardIt2 d_first );
	  template< class InputIt, class OutputIt, class
	  BinaryOperation >				   (1)

	  OutputIt	   adjacent_difference(		InputIt		first,
       (until C++20)
	  InputIt last,

	  OutputIt d_first, BinaryOperation op );
	  template< class InputIt, class OutputIt, class
	  BinaryOperation >

	  constexpr	   OutputIt	   adjacent_difference(	       InputIt
       (since C++20)
	  first, InputIt last,				       (3)

	  OutputIt d_first, BinaryOperation op );
	  template< class ExecutionPolicy, class
	  ForwardIt1, class ForwardIt2,	class
	  BinaryOperation >

	  ForwardIt2	 adjacent_difference(				   (4)
       (since C++17)
	  ExecutionPolicy&& policy, ForwardIt1 first,
	  ForwardIt1 last,

	  ForwardIt2 d_first, BinaryOperation op );

	  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 be-
       ginning at
	  d_first + 1. An unmodified copy of *first is written to *d_first.

	  1,3) First, creates an accumulator acc whose type is InputIt's value
       type,
	  initializes it with *first, and  assigns  the	 result	 to  *d_first.
       Then, for every
	  iterator  i  in  [first  +  1, last) in order, creates an object val
       whose type is
	  InputIt's value type,	initializes it with *i,	computes
	  val -	acc
	  (until C++20)
	  val -	std::move(acc)
	  (since C++20)	(overload (1)) or
	  op(val, acc)
	  (until C++20)
	  op(val, std::move(acc))
	  (since C++20)	(overload (3)),	assigns	the result to *(d_first	+ (i -
       first)),	and
	  move assigns from val	to acc.
	  first	may be equal to	d_first.
	  2,4) Performs	*d_first = *first;. For	every d	in [1, last - first  -
       1], assigns
	  *(first  +  d) - *(first + d - 1) (overload (2)) or op(*(first + d),
       *(first + d - 1))
	  (overload (4)) to *(d_first +	d). This is executed according to pol-
       icy. These
	  overloads do not participate in overload resolution unless
	  std::is_execution_policy_v<std::decay_t<ExecutionPolicy>>
	  (until C++20)
	  std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>>
	  (since C++20)	is true.
	  The behavior is undefined if the input and output ranges overlap  in
       any way.

	  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  (since C++11)
	  modify any elements of the ranges involved.

Parameters
	  first, last  -  the range of elements
	  d_first      -  the beginning	of the destination range
	  policy	-   the	 execution policy to use. See execution	policy
       for details.
			  binary operation function object that	 will  be  ap-
       plied.

			  The  signature  of the function should be equivalent
       to the following:

			  Ret fun(const	Type1 &a, const	Type2 &b);
	  op	       -
			  The signature	does not need to have const &.
			  The types Type1 and Type2 must be such that  an  ob-
       ject of type
			  iterator_traits<InputIt>::value_type	can be implic-
       itly converted to
			  both of them.	The type Ret must be such that an  ob-
       ject of type
			  OutputIt can be dereferenced and assigned a value of
       type Ret.

Type requirements
	  -
	  InputIt must meet the	requirements of	LegacyInputIterator. InputIt's
       value type must
	  be MoveAssignable and	constructible from the type of *first
	  -
	  OutputIt  must  meet	the requirements of LegacyOutputIterator. both
       acc (the
	  accumulated value) and the result of
	  val -	acc or op(val, acc)
	  (until C++20)
	  val -	std::move(acc) or op(val, std::move(acc))
	  (since C++20)	must be	writable to OutputIt
	  -
	  ForwardIt1, ForwardIt2 must  meet  the  requirements	of  LegacyFor-
       wardIterator. The
	  results  of *first, *first - *first (for (2))	and op(*first, *first)
       (for (4)) must
	  be writable to ForwardIt2.

Return value
	  Iterator 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

Exceptions
	  The overloads	with a template	parameter named	ExecutionPolicy	report
       errors as
	  follows:

	    * If execution of a	function invoked  as  part  of	the  algorithm
       throws an exception
	      and ExecutionPolicy is one of the	standard policies, std::termi-
       nate is called.
	      For  any	other ExecutionPolicy, the behavior is implementation-
       defined.
	    * If the algorithm fails to	 allocate  memory,  std::bad_alloc  is
       thrown.

Possible implementation
First version
	  template<class InputIt, class	OutputIt>
	  constexpr // since C++20
	  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 - std::move(acc); //	std::move since	C++20
		  acc =	std::move(val);
	      }
	      return ++d_first;
	  }

Second version
	  template<class InputIt, class	OutputIt, class	BinaryOperation>
	  constexpr // since C++20
	  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,  std::move(acc));  // std::move since
       C++20
		  acc =	std::move(val);
	      }
	      return ++d_first;
	  }

Example
       // Run this code

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

	auto print = [](auto comment, auto const& sequence) {
	    std::cout << comment;
	    for	(const auto& n : sequence)
		std::cout << n << ' ';
	    std::cout << '\n';
	};

	int main()
	{
	    // Default implementation -	the difference b/w two adjacent	items

	    std::vector	v {4, 6, 9, 13,	18, 19,	19, 15,	10};
	    print("Initially, v	= ", v);
	    std::adjacent_difference(v.begin(),	v.end(), v.begin());
	    print("Modified v =	", v);

	    // Fibonacci

	    std::array<int, 10>	a {1};
	    adjacent_difference(begin(a),   std::prev(end(a)),	 std::next(be-
       gin(a)),	std::plus<> {});
	    print("Fibonacci, a	= ", a);
	}

Output:
	Initially, v = 4 6 9 13	18 19 19 15 10
	Modified v = 4 2 3 4 5 1 0 -4 -5
	Fibonacci, a = 1 1 2 3 5 8 13 21 34 55

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

http://cppreference.com		  2022.07.31	   std::adjacent_difference(3)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=std::adjacent_difference&sektion=3&manpath=FreeBSD+Ports+15.0>

home | help