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

FreeBSD Manual Pages

  
 
  

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

NAME
       std::exclusive_scan - std::exclusive_scan

Synopsis
	  Defined in header <numeric>
	  template< class InputIt, class OutputIt, class T >
								       (since
       C++17)
	  OutputIt exclusive_scan( InputIt first, InputIt last,	   (1) (const-
       expr since C++20)

				   OutputIt d_first, T init );
	  template< class ExecutionPolicy,

		    class ForwardIt1, class ForwardIt2,	class T	>
	  ForwardIt2  exclusive_scan( ExecutionPolicy&&	policy,	    (2)	(since
       C++17)
				     ForwardIt1	first, ForwardIt1
	  last,

				     ForwardIt2	d_first, T init	);
	  template< class InputIt, class OutputIt,

		    class T, class BinaryOp >				(since
       C++17)
	  OutputIt exclusive_scan( InputIt first, InputIt last,	   (3) (const-
       expr since C++20)

				   OutputIt d_first, T init,
	  BinaryOp op );
	  template< class ExecutionPolicy,

		    class ForwardIt1, class ForwardIt2,
		    class T, class BinaryOp >
	  ForwardIt2  exclusive_scan( ExecutionPolicy&&	policy,	    (4)	(since
       C++17)
				     ForwardIt1	first, ForwardIt1
	  last,

				     ForwardIt2	d_first, T init,
	  BinaryOp op );

	  1)  Equivalent  to  exclusive_scan(first,   last,   d_first,	 init,
       std::plus<>().
	  3) Computes the exclusive prefix sum using op.
	  For  each integer i in [0, std::distance(first, last)), performs the
       following
	  operations in	order:
	   1. Creates a	sequence which is formed by init followed by the  ele-
       ments of
	      [first, iter) in order, where iter is the	next i
	      th iterator of first.
	   2. Computes the generalized noncommutative sum of the sequence over
       op.
	   3. Assigns the result to *dest, where dest is the next i
	      th iterator of d_first.
	  2,4) Same as (1,3), but executed according to	policy.
	  These	overloads participate in overload resolution only if

	  std::is_execution_policy_v<std::decay_t<ExecutionPolicy>>  is	 true.
       (until
										    C++20)
	  std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>>  is
       true. (since
										    C++20)

	  The  generalized noncommutative sum of a sequence of elements	over a
       binary operation
	  binary_op is defined as follows:

	    * If the sequence only has one element, the	sum is	the  value  of
       the element.
	    * Otherwise, performs the following	operations in order:
	   1.  Selects	any two	adjacent elements elem1	and elem2 from the se-
       quence.
	   2. Calculates binary_op(elem1, elem2) and replaces the two elements
       in the sequence
	      with the result.
	   3. Repeats steps 1 and 2 until there	is only	one element in the se-
       quence.

	  Given	binary_op as the actual	binary operation:

	    * The result is non-deterministic if the binary_op is not associa-
       tive (such as
	      floating-point addition).
	    * If any of	the following values is	not convertible	to T, the pro-
       gram is
	      ill-formed:

	    * binary_op(init, *first)
	    * binary_op(init, init)
	    * binary_op(*first,	*first)
	    * If any of	the following conditions is satisfied, the behavior is
       undefined:

	    * T	is not MoveConstructible.
	    * binary_op	modifies any element of	[first,	last).
	    * binary_op	invalidates any	iterator or subrange of	[first,	last].

Parameters
	  first, last -	the range of elements to sum
	  d_first     -	the beginning of the destination range;	may  be	 equal
       to first
	  policy       - the execution policy to use. See execution policy for
       details.
	  init	      -	the initial value
	  op	      -	binary FunctionObject that will	be applied in  to  the
       result of
			dereferencing  the  input  iterators,  the  results of
       other op, and init

Type requirements
	  -
	  InputIt must meet the	requirements of	LegacyInputIterator.
	  -
	  OutputIt must	meet the requirements of LegacyOutputIterator.
	  -
	  ForwardIt1, ForwardIt2 must  meet  the  requirements	of  LegacyFor-
       wardIterator.

Return value
	  Iterator to the element past the last	element	written.

Complexity
	  Given	\(\scriptsize N\)N as std::distance(first, last):

	  1,2) \(\scriptsize O(N)\)O(N)	applications of	std::plus<>().
	  3,4) \(\scriptsize O(N)\)O(N)	applications of	op.

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.

Example
       // Run this code

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

	int main()
	{
	    std::vector	data{3,	1, 4, 1, 5, 9, 2, 6};

	    std::cout << "Exclusive sum: ";
	    std::exclusive_scan(data.begin(), data.end(),
				std::ostream_iterator<int>(std::cout, "	"),
				0);

	    std::cout << "\nInclusive sum: ";
	    std::inclusive_scan(data.begin(), data.end(),
				std::ostream_iterator<int>(std::cout, "	"));

	    std::cout << "\n\nExclusive	product: ";
	    std::exclusive_scan(data.begin(), data.end(),
				std::ostream_iterator<int>(std::cout, "	"),
				1, std::multiplies<>{});

	    std::cout << "\nInclusive product: ";
	    std::inclusive_scan(data.begin(), data.end(),
				std::ostream_iterator<int>(std::cout, "	"),
				std::multiplies<>{});
	}

Output:
	Exclusive sum: 0 3 4 8 9 14 23 25
	Inclusive sum: 3 4 8 9 14 23 25	31

	Exclusive product: 1 3 3 12 12 60 540 1080
	Inclusive product: 3 3 12 12 60	540 1080 6480

See also
				   computes the	differences  between  adjacent
       elements	in a
	  adjacent_difference	   range
				   (function template)
	  accumulate		   sums	up or folds a range of elements
				   (function template)
	  partial_sum		   computes the	partial	sum of a range of ele-
       ments
				   (function template)
	  transform_exclusive_scan  applies  an	invocable, then	calculates ex-
       clusive scan
	  (C++17)		   (function template)
	  inclusive_scan	   similar to std::partial_sum,	 includes  the
       i^th input
	  (C++17)		   element in the i^th sum
				   (function template)

http://cppreference.com		  2024.06.10		std::exclusive_scan(3)

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

home | help