| Technical Specification | ||||
| Filesystem library(filesystem TS) | ||||
| Library fundamentals(library fundamentals TS) | ||||
| Library fundamentals 2(library fundamentals TS v2) | ||||
| Library fundamentals 3(library fundamentals TS v3) | ||||
| Extensions for parallelism(parallelism TS) | ||||
| Extensions for parallelism 2(parallelism TS v2) | ||||
| Extensions for concurrency(concurrency TS) | ||||
| Extensions for concurrency 2(concurrency TS v2) | ||||
| Concepts(concepts TS) | ||||
| Ranges(ranges TS) | ||||
| Reflection(reflection TS) | ||||
| Mathematical special functions(special functions TR) | ||||
| Experimental Non-TS | ||||
| Pattern Matching | ||||
| Linear Algebra | ||||
| std::execution | ||||
| Contracts | ||||
| 2D Graphics |
| Execution policies | ||||
| Parallel algorithms | ||||
| Parallel exceptions | ||||
| Parallelized version of existing algorithms | ||||
| New algorithms | ||||
parallel::transform_reduce | ||||
Defined in header <experimental/numeric> | ||
template<class InputIt,class UnaryOp,class T,class BinaryOp> T transform_reduce( InputIt first, InputIt last, | (1) | (parallelism TS) |
template<class ExecutionPolicy, class InputIt,class UnaryOp,class T,class BinaryOp> | (2) | (parallelism TS) |
Appliesunary_op to each element in the range[first, last) and reduces the results (possibly permuted and aggregated in unspecified manner) along with the initial valueinit overbinary_op.
The behavior is non-deterministic ifbinary_op is not associative or not commutative.
The behavior is undefined ifunary_op orbinary_op modifies any element or invalidates any iterator in[first, last).
Contents |
| first, last | - | the range of elements to apply the algorithm to |
| init | - | the initial value of the generalized sum |
| policy | - | theexecution policy |
| unary_op | - | unaryFunctionObject that will be applied to each element of the input range. The return type must be acceptable as input tobinary_op |
| binary_op | - | binaryFunctionObject that will be applied in unspecified order to the results ofunary_op, the results of otherbinary_op andinit |
| Type requirements | ||
-InputIt must meet the requirements ofLegacyInputIterator. | ||
Generalized sum ofinit andunary_op(*first),unary_op(*(first+1)), ...unary_op(*(last-1)) overbinary_op,where generalized sumGSUM(op, a1, ..., aN) is defined as follows:
in other words, the results ofunary_op may be grouped and arranged in arbitrary order.
O(last - first) applications each ofunary_op andbinary_op.
policy isparallel_vector_execution_policy,std::terminate is called.policy issequential_execution_policy orparallel_execution_policy, the algorithm exits with anexception_list containing all uncaught exceptions. If there was only one uncaught exception, the algorithm may rethrow it without wrapping inexception_list. It is unspecified how much work the algorithm will perform before returning after the first exception was encountered.policy is some other type, the behavior is implementation-defined.exception_list when handling a user exception),std::bad_alloc is thrown.unary_op is not applied toinit.
If the range is empty,init is returned, unmodified.
policy is an instance ofsequential_execution_policy, all operations are performed in the calling thread.policy is an instance ofparallel_execution_policy, operations may be performed in unspecified number of threads, indeterminately sequenced with each other.policy is an instance ofparallel_vector_execution_policy, execution may be both parallelized and vectorized: function body boundaries are not respected and user code may be overlapped and combined in arbitrary manner (in particular, this implies that a user-provided Callable must not acquire a mutex to access a shared resource).transform_reduce can be used to parallelizestd::inner_product:
#include <boost/iterator/zip_iterator.hpp>#include <boost/tuple.hpp>#include <experimental/execution_policy>#include <experimental/numeric>#include <functional>#include <iostream>#include <iterator>#include <vector> int main(){std::vector<double> xvalues(10007,1.0), yvalues(10007,1.0); double result= std::experimental::parallel::transform_reduce(std::experimental::parallel::par, boost::iterators::make_zip_iterator( boost::make_tuple(std::begin(xvalues),std::begin(yvalues))), boost::iterators::make_zip_iterator( boost::make_tuple(std::end(xvalues),std::end(yvalues))),[](auto r){return boost::get<0>(r)* boost::get<1>(r);}0.0,std::plus<>());std::cout<< result<<'\n';}
Output:
10007
| 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] | |
(parallelism TS) | similar tostd::accumulate, except out of order (function template)[edit] |