std::transform_reduce
ヘッダ <numeric> で定義 | ||
template<class InputIt1, class InputIt2, class T> T transform_reduce(InputIt1 first1, InputIt1 last1, InputIt2 first2, T init); | (1) | (C++17およびそれ以降) |
template<class InputIt1, class InputIt2, class T, class BinaryOp1, class BinaryOp2> T transform_reduce(InputIt1 first1, InputIt1 last1, InputIt2 first2, | (2) | (C++17およびそれ以降) |
template<class InputIt, class T, class BinaryOp, class UnaryOp> T transform_reduce(InputIt first, InputIt last, | (3) | (C++17およびそれ以降) |
template<class ExecutionPolicy, class ForwardIt1, class ForwardIt2, class T> | (4) | (C++17およびそれ以降) |
template<class ExecutionPolicy, class ForwardIt1, class ForwardIt2, class T, class BinaryOp1, class BinaryOp2> | (5) | (C++17およびそれ以降) |
template<class ExecutionPolicy, class ForwardIt, class T, class BinaryOp, class UnaryOp> | (6) | (C++17およびそれ以降) |
transform_reduce(first1, last1, first2, init, std::plus<>(), std::multiplies<>());
と同等です。 実質的にデフォルトの std::inner_product の並列化バージョンです。binary_op2
を適用し、その結果を初期値 init
から binary_op1
によって縮小します (未規定の方法で並び替えられたり集約されたりする可能性があります)。unary_op
を適用し、その結果を初期値 init
から binary_op
によって縮小します (未規定の方法で並び替えられたり集約されたりする可能性があります)。policy
に従って実行されます。 このオーバーロードは、 std::is_execution_policy_v<std::decay_t<ExecutionPolicy>> が true である場合にのみ、オーバーロード解決に参加します。binary_op
または binary_op2
が結合法則または交換法則を満たさない場合、動作は非決定的になります。
unary_op
、binary_op
、binary_op1
または binary_op2
が入力範囲内のいずれかのイテレータ (終端イテレータを含む) を無効化する、またはいずれかの要素を変更する場合、動作は未定義です。
目次 |
[編集]引数
first, last | - | アルゴリズムを適用する要素の範囲 |
init | - | 一般化された合計の初期値 |
policy | - | 使用する実行ポリシー。 詳細は実行ポリシーを参照してください |
unary_op | - | 入力範囲の各要素に適用される単項 FunctionObject 。 戻り値の型は binary_op への入力して受け付けられなければなりません |
binary_op | - | unary_op の結果、他の binary_op の結果および init に未規定の順序で適用される二項 FunctionObject |
型の要件 | ||
-オーバロード (3,6) を使用するためには T は MoveConstructible の要件を満たさなければなりません。 また、式 binary_op(init, unary_op(*first))、binary_op(unary_op(*first), init)、binary_op(init, init) および binary_op(unary_op(*first), unary_op(*first)) の結果は T に変換可能でなければなりません。 | ||
-オーバロード (2,5) を使用するためには T は MoveConstructible の要件を満たさなければなりません。 また、式 binary_op1(init, binary_op2(*first1, *first2))、binary_op1(binary_op2(*first1, *first2), init)、binary_op1(init, init) および binary_op1(binary_op2(*first1, *first2), binary_op2(*first1, *first2)) の結果は T に変換可能でなければなりません。 | ||
-InputIt は InputIterator の要件を満たさなければなりません。 | ||
-ForwardIt は ForwardIterator の要件を満たさなければなりません。 |
[編集]戻り値
init
および binary_op2(*first,*first2)
, binary_op2(*(first+1),*(first2+1))
, ... の binary_op1
による一般化された合計。init
および unary_op(*first)
, unary_op(*(first+1))
, ... unary_op(*(last-1))
の binary_op
による一般化された合計。ただし一般化された合計 GSUM(op, a
1, ..., a
N) は以下のように定義されます。
- N=1 であれば、 a
1 です。 - N > 1 であれば、 op(GSUM(op, b
1, ..., b
K), GSUM(op, b
M, ..., b
N)) です。 ただし、
- b
1, ..., b
N は a1, ..., aN の任意の順列であってもよく、 - 1 < K+1 = M ≤ N です。
- b
別の言い方をすると、 unary_op や binary_op1 の結果は適当な順序でグループ化されたり並び替えられたりすることがあります。
[編集]計算量
binary_op1
および binary_op2
の適用。unary_op
および binary_op
の適用。[編集]例外
テンプレート引数 ExecutionPolicy
を持つオーバーロードは以下のようにエラーを報告します。
- アルゴリズムの一部として呼び出された関数の実行が例外を投げ、
ExecutionPolicy
が3つの標準のポリシーのいずれかの場合は、 std::terminate が呼ばれます。 それ以外のあらゆるExecutionPolicy
については、動作は処理系定義です。 - アルゴリズムがメモリの確保に失敗した場合は、 std::bad_alloc が投げられます。
[編集]ノート
単項+二項のオーバーロード (3,6) において、 unary_op
は init
には適用されません。
first == last
または first1 == last1
の場合は、 init
が変更されずに返されます。
[編集]例
transform_reduce は std::inner_product を並列化するために使用することができます。
#include <vector>#include <functional>#include <iostream>#include <numeric>#include <execution> int main(){std::vector<double> xvalues(10007, 1.0), yvalues(10007, 1.0); double result = std::transform_reduce(std::execution::par, xvalues.begin(), xvalues.end(), yvalues.begin(), 0.0);std::cout<< result <<'\n';}
出力:
10007
[編集]関連項目
指定範囲の要素を合計します (関数テンプレート) | |
指定範囲の要素に関数を適用します (関数テンプレート) | |
(C++17) | std::accumulate と同様ですが、計算順序は不定です (関数テンプレート) |