std::experimental::parallel::reduce - cppreference.com (original) (raw)

Defined in header <experimental/numeric>
template< class InputIt > typename std::iterator_traits<InputIt>::value_type reduce( InputIt first, InputIt last ); (1) (parallelism TS)
template< class ExecutionPolicy, class InputIterator > typename std::iterator_traits<InputIt>::value_type reduce( ExecutionPolicy&& policy, InputIt first, InputIt last ); (2) (parallelism TS)
template< class InputIt, class T >T reduce( InputIt first, InputIt last, T init ); (3) (parallelism TS)
template< class ExecutionPolicy, class InputIt, class T >T reduce( ExecutionPolicy&& policy, InputIt first, InputIt last, T init ); (4) (parallelism TS)
template< class InputIt, class T, class BinaryOp >T reduce( InputIt first, InputIt last, T init, BinaryOp binary_op ); (5) (parallelism TS)
template< class ExecutionPolicy, class InputIt, class T, class BinaryOp > T reduce( ExecutionPolicy&& policy, InputIt first, InputIt last, T init, BinaryOp binary_op ); (6) (parallelism TS)
  1. Same as reduce(first, last, typename std::iterator_traits<InputIt>::value_type{}).

  2. Same as reduce(first, last, init, std::plus<>()).

  3. Reduces the range [first, last), possibly permuted and aggregated in unspecified manner, along with the initial value init over binary_op.

2,4,6) Same as (1,3,5), but executed according to policy.

The behavior is non-deterministic if binary_op is not associative or not commutative.

The behavior is undefined if binary_op modifies any element or invalidates any iterator in [first, last).

Contents

[edit] Parameters

first, last - the range of elements to apply the algorithm to
init - the initial value of the generalized sum
policy - the execution policy
binary_op - binary FunctionObject that will be applied in unspecified order to the result of dereferencing the input iterators, the results of other binary_op and init
Type requirements
-InputIt must meet the requirements of LegacyInputIterator.

[edit] Return value

Generalized sum of init and *first, *(first + 1), ... *(last - 1) over binary_op,

where generalized sum GSUM(op, a1, ..., aN) is defined as follows:

in other words, the elements of the range may be grouped and rearranged in arbitrary order.

[edit] Complexity

O(last - first) applications of binary_op.

[edit] Exceptions

[edit] Notes

If the range is empty, init is returned, unmodified.

[edit] Example

reduce is the out-of-order version of std::accumulate:

Possible output:

std::accumulate result 5000003.50000 took 12.7365 ms parallel::reduce result 5000003.50000 took 5.06423 ms

[edit] See also

| | sums up or folds a range of elements (function template) [edit] | | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | | applies a function to a range of elements, storing results in a destination range (function template) [edit] | | | applies a functor, then reduces out of order (function template) [edit] |