std::exclusive_scan
ja.cppreference.net より
| ヘッダ <numeric>
|
||
template< class InputIt, class OutputIt, class T >
OutputIt exclusive_scan( InputIt first, InputIt last,
OutputIt d_first, T init );
|
で定義 (1) | (C++17 から) (C++20 から constexpr) |
template< class ExecutionPolicy,
class ForwardIt1, class ForwardIt2, class T >
ForwardIt2 exclusive_scan( ExecutionPolicy&& policy,
ForwardIt1 first, ForwardIt1 last,
ForwardIt2 d_first, T init );
|
(2) | (C++17 から) |
template< class InputIt, class OutputIt,
class T, class BinaryOp >
OutputIt exclusive_scan( InputIt first, InputIt last,
OutputIt d_first, T init, BinaryOp op );
|
(3) | (C++17 から) (C++20 から constexpr) |
template< class ExecutionPolicy,
class ForwardIt1, class ForwardIt2,
class T, class BinaryOp >
ForwardIt2 exclusive_scan( ExecutionPolicy&& policy,
ForwardIt1 first, ForwardIt1 last,
ForwardIt2 d_first, T init, BinaryOp op );
|
(4) | (C++17 から) |
1)
exclusive_scan(first, last, d_first, init, std::plus<>() と同等。(3)3)
op を使用して排他的前置和を計算する。i の各整数 [0, std::distance(first, last)) に対して、以下の操作を順に実行する:
initの後に[first,iter)の要素を順に連結したシーケンスを作成する。ここで、iterはi番目 (0 から数える) のfirstの次のイテレータである。- 演算
opを使用して、そのシーケンスの一般化非可換和を計算する。 - 結果を
*destに代入する。ここで、destはi番目 (0 から数える) のd_firstの次のイテレータである。
2,4) (1,3) と同じだが、
policy に従って実行される。 これらのオーバーロードは、以下の式の値が
true である場合にのみオーバーロード解決に参加する:
|
|
(C++20 まで) |
|
|
(C++20 から) |
二項演算 に対する要素シーケンスの一般化非可換和binary_opは次のように定義される:
- シーケンスに要素が1つしかない場合、和はその要素の値である。
- そうでない場合、以下の操作を順に実行する:
- シーケンスから任意の隣接する2つの要素
elem1とelem2を選択する。 binary_op(elem1, elem2)を計算し、シーケンス内のその2つの要素を結果で置き換える。- シーケンス内の要素が1つになるまで、ステップ1と2を繰り返す。
実際の二項演算を binary_op とすると:
binary_opが結合的でない場合 (浮動小数点加算など)、結果は非決定的となる。
- 以下の値のいずれかが
Tに変換可能でない場合、プログラムは ill-formed となる:
binary_op(init, *first)binary_op(init, init)binary_op(*first, *first)
- 以下の条件のいずれかが満たされる場合、動作は未定義となる:
Tが MoveConstructible でない。binary_opが[first,last)の任意の要素を変更する。binary_opが[first,last]の任意のイテレータまたは部分範囲を無効化する。
パラメータ
| first, last | - | 合計する要素の範囲を定義するイテレータのペア |
| d_first | - | 出力先範囲の先頭; first と等しくてもよい |
| policy | - | 使用する実行ポリシー |
| init | - | 初期値 |
| op | - | 入力イテレータのデリファレンス結果、他の op の結果、および init に適用される二項関数オブジェクト |
| 型要件 | ||
-
InputIt
は
LegacyInputIterator
の要件を満たさなければならない
|
||
-
OutputIt
は
LegacyOutputIterator
の要件を満たさなければならない
|
||
-
ForwardIt1, ForwardIt2
は
LegacyForwardIterator
の要件を満たさなければならない
|
||
戻り値
書き込まれた最後の要素の次の要素を指すイテレータ。
計算量
与えられた N を std:: distance ( first, last ) として:
3,4)
O(N)
回の
op
の適用。
例外
ExecutionPolicyという名前のテンプレートパラメータを持つオーバーロードは、
以下のようにエラーを報告します:
-
アルゴリズムの一部として呼び出された関数の実行が例外をスローした場合、
ExecutionPolicyが 標準ポリシー のいずれかであるとき、 std::terminate が呼び出される。それ以外のExecutionPolicyについては、動作は実装定義である。 - アルゴリズムがメモリの確保に失敗した場合、 std::bad_alloc がスローされる。
例
このコードを実行
#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 << "排他的和: "; std::exclusive_scan(data.begin(), data.end(), std::ostream_iterator<int>(std::cout, " "), 0); std::cout << "\n包括的和: "; std::inclusive_scan(data.begin(), data.end(), std::ostream_iterator<int>(std::cout, " ")); std::cout << "\n\n排他的積: "; std::exclusive_scan(data.begin(), data.end(), std::ostream_iterator<int>(std::cout, " "), 1, std::multiplies<>{}); std::cout << "\n包括的積: "; std::inclusive_scan(data.begin(), data.end(), std::ostream_iterator<int>(std::cout, " "), std::multiplies<>{}); }
出力:
排他的和: 0 3 4 8 9 14 23 25 包括的和: 3 4 8 9 14 23 25 31 排他的積: 1 3 3 12 12 60 540 1080 包括的積: 3 3 12 12 60 540 1080 6480
関連項目
|
範囲内の隣接する要素間の差を計算する
(関数テンプレート) |
|
|
範囲の要素を合計または畳み込む
(関数テンプレート) |
|
|
範囲の要素の部分和を計算する
(関数テンプレート) |
|
|
(C++17)
|
呼び出し可能オブジェクトを適用した後、排他的スキャンを計算する
(関数テンプレート) |
|
(C++17)
|
std::partial_sum
と類似し、
i
th
番目の入力要素を
i
th
番目の合計に含める
(関数テンプレート) |