| Constrained algorithms and algorithms on ranges(C++20) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Constrained algorithms, e.g.ranges::copy,ranges::sort, ... | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Execution policies(C++17) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Numeric operations | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Operations on uninitialized memory | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Common mathematical functions | |||||||||||||||||||||||||||||||
| Mathematical special functions(C++17) | |||||||||||||||||||||||||||||||
| Mathematical constants(C++20) | |||||||||||||||||||||||||||||||
| Basic linear algebra algorithms(C++26) | |||||||||||||||||||||||||||||||
| Data-parallel types (SIMD)(C++26) | |||||||||||||||||||||||||||||||
| Floating-point environment(C++11) | |||||||||||||||||||||||||||||||
| Complex numbers | |||||||||||||||||||||||||||||||
Numeric array (valarray) | |||||||||||||||||||||||||||||||
| Pseudo-random number generation | |||||||||||||||||||||||||||||||
| Bit manipulation(C++20) | |||||||||||||||||||||||||||||||
| Saturation arithmetic(C++26) | |||||||||||||||||||||||||||||||
| Factor operations | |||||||||||||||||||||||||||||||
|
| ||||||||||||||||||||||||||||||
| Interpolations | |||||||||||||||||||||||||||||||
|
| ||||||||||||||||||||||||||||||
| Generic numeric operations | |||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||
| C-style checked integer arithmetic | |||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||
Defined in header <numeric> | ||
template<class InputIt1,class InputIt2,class T> T transform_reduce( InputIt1 first1, InputIt1 last1, | (1) | (since C++17) (constexpr since C++20) |
template<class ExecutionPolicy, class ForwardIt1,class ForwardIt2,class T> | (2) | (since C++17) |
template<class InputIt1,class InputIt2,class T, class BinaryOp1,class BinaryOp2> | (3) | (since C++17) (constexpr since C++20) |
template<class ExecutionPolicy, class ForwardIt1,class ForwardIt2,class T, | (4) | (since C++17) |
template<class InputIt,class T, class BinaryOp,class UnaryOp> | (5) | (since C++17) (constexpr since C++20) |
template<class ExecutionPolicy, class ForwardIt,class T, | (6) | (since C++17) |
[first1, last1) and the range ofstd::distance(first1, last1) elements starting fromfirst2 and reduces the results (possibly permuted and aggregated in unspecified manner) along with the initial valueinit overreduce.T, the program is ill-formed:T is notMoveConstructible.[first1, last1) or[first2, last2).[first1, last1] or[first2, last2].[first, last) and reduces the results (possibly permuted and aggregated in unspecified manner) along with the initial valueinit overreduce.T, the program is ill-formed:T is notMoveConstructible.[first, last).[first, last].std::is_execution_policy_v<std::decay_t<ExecutionPolicy>> istrue. | (until C++20) |
std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>> istrue. | (since C++20) |
Contents |
| first1, last1 | - | the pair of iterators defining therange of elements to be taken as the left operand oftransform |
| first2 | - | the start of range of elements to be taken as the right operand oftransform |
| first, last | - | the pair of iterators defining therange of elements to be taken as the operand oftransform |
| init | - | the initial value of the generalized sum |
| policy | - | theexecution policy to use |
| reduce | - | binaryFunctionObject that will be applied in unspecified order to the results oftransform, the results of otherreduce andinit. |
| transform | - | unary or binaryFunctionObject that will be applied to each element of the input range(s). The return type must be acceptable as input toreduce. |
| Type requirements | ||
-InputIt1, InputIt2, InputIt must meet the requirements ofLegacyInputIterator. | ||
-ForwardIt1, ForwardIt2, ForwardIt must meet the requirements ofLegacyForwardIterator. | ||
Thegeneralized sum of a group of elements over an binary operationbinary_op is defined as follows:
Given\(\scriptsize N\)N asstd::distance(first1, last1) (orstd::distance(first, last) for overloads(5,6)):
The overloads with a template parameter namedExecutionPolicy report errors as follows:
ExecutionPolicy is one of thestandard policies,std::terminate is called. For any otherExecutionPolicy, the behavior is implementation-defined.transform is never applied toinit.
Iffirst== last orfirst1== last1,init is returned, unmodified.
transform_reduce can be used to parallelizestd::inner_product. Some systems may need additional support to get advantages of parallel execution. E.g., on GNU/Linux, theIntel TBB be installed and-ltbb option be provided to gcc/clang compiler.
#if PARALLEL#include <execution>#define PAR std::execution::par,#else#define PAR#endif #include <algorithm>#include <functional>#include <iostream>#include <iterator>#include <locale>#include <numeric>#include <vector> // to parallelize non-associate accumulative operation, you'd better choose// transform_reduce instead of reduce; e.g., a + b * b != b + a * avoid print_sum_squared(longconst num){std::cout.imbue(std::locale{"en_US.UTF8"});std::cout<<"num = "<< num<<'\n'; // create an immutable vector filled with pattern: 1,2,3,4, 1,2,3,4 ...conststd::vector<long> v{[n= num*4]{std::vector<long> v; v.reserve(n);std::generate_n(std::back_inserter(v), n,[i=0]() mutable{return1+ i++%4;});return v;}()}; auto squared_sum=[](auto sum,auto val){return sum+ val* val;}; auto sum1=std::accumulate(v.cbegin(), v.cend(),0L, squared_sum);std::cout<<"accumulate(): "<< sum1<<'\n'; auto sum2=std::reduce(PAR v.cbegin(), v.cend(),0L, squared_sum);std::cout<<"reduce(): "<< sum2<<'\n'; auto sum3= std::transform_reduce(PAR v.cbegin(), v.cend(),0L,std::plus{},[](auto val){return val* val;});std::cout<<"transform_reduce(): "<< sum3<<"\n\n";} int main(){ print_sum_squared(1); print_sum_squared(1'000); print_sum_squared(1'000'000);}
Possible output:
num = 1accumulate(): 30reduce(): 30transform_reduce(): 30 num = 1,000accumulate(): 30,000reduce(): -7,025,681,278,312,630,348transform_reduce(): 30,000 num = 1,000,000accumulate(): 30,000,000reduce(): -5,314,886,882,370,003,032transform_reduce(): 30,000,000 // Compile-options for parallel execution on POSIX:// g++ -O2 -std=c++17 -Wall -Wextra -pedantic -DPARALLEL ./example.cpp -ltbb -o tr; ./tr
| 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] | |
(C++17) | similar tostd::accumulate, except out of order (function template)[edit] |