std:: transform_inclusive_scan
|
ヘッダー
<numeric>
で定義
|
||
|
template
<
class
InputIt,
class
OutputIt,
class
BinaryOp,
class
UnaryOp
>
|
(1) |
(C++17以降)
(constexpr C++20以降) |
|
template
<
class
ExecutionPolicy,
class
ForwardIt1,
class
ForwardIt2,
|
(2) | (C++17以降) |
|
template
<
class
InputIt,
class
OutputIt,
class
BinaryOp,
class
UnaryOp,
class
T
>
|
(3) |
(C++17以降)
(constexpr C++20以降) |
|
template
<
class
ExecutionPolicy,
class
ForwardIt1,
class
ForwardIt2,
|
(4) | (C++17以降) |
[
0
,
std::
distance
(
first, last
)
)
の範囲で、以下の操作を順次実行します:
-
[first,iter]の要素を unary_op で変換した値から成るシーケンスを順序通りに生成します。ここで iter は first から i 番目 の次のイテレータです。 - シーケンスの一般化された非可換和を binary_op を用いて計算します。
- 結果を * dest に代入します。ここで dest は d_first から i 番目 の次のイテレータです。
[
first
,
iter
]
の要素が順に続く形で構成されます。
|
std:: is_execution_policy_v < std:: decay_t < ExecutionPolicy >> が true であること。 |
(C++20まで) |
|
std:: is_execution_policy_v < std:: remove_cvref_t < ExecutionPolicy >> が true であること。 |
(C++20以降) |
要素のシーケンスに対する二項演算 binary_op に関する 一般化非可換和 は以下のように定義されます:
- シーケンスに要素が1つしかない場合、合計はその要素の値です。
- それ以外の場合、以下の操作を順番に実行します:
- シーケンスから任意の2つの隣接要素 elem1 と elem2 を選択します。
- binary_op ( elem1, elem2 ) を計算し、シーケンス内の2つの要素を結果で置き換えます。
- シーケンスに要素が1つだけになるまで、ステップ1と2を繰り返します。
binary_op
が結合的でない場合(浮動小数点の加算など)、結果は非決定的になります。
オーバーロード (1,2) の場合、 binary_op ( unary_op ( * first ) , unary_op ( * first ) ) が value type に変換できない場合、プログラムは不適格となる。 decltype ( first ) の
注記: - HTMLタグと属性はそのまま保持 - `
`、`
`、`
オーバーロード
(3,4)
について、以下のいずれかの値が
T
に変換可能でない場合、プログラムは不適格です:
- binary_op ( init, init )
- binary_op ( init, unary_op ( * first ) )
- binary_op ( unary_op ( * first ) , unary_op ( * first ) )
タグ内のテキスト、C++固有用語は翻訳対象外となっています。上記のコード部分は全て翻訳せずにそのまま保持されています)
以下のいずれかの条件が満たされる場合、動作は未定義です:
- オーバーロード (1,2) について、 decltype ( first ) の値型は MoveConstructible ではありません。
-
オーバーロード
(3,4)
について、
Tは MoveConstructible ではありません。 -
unary_op
または
binary_op
が
[first,last)の任意の要素を変更する場合。 -
unary_op
または
binary_op
が
[first,last]の任意のイテレータまたは部分範囲を無効化する場合。
目次 |
パラメータ
| first, last | - | 合計する要素の範囲を定義するイテレータのペア |
| d_first | - | 出力先範囲の先頭; first と等しくてもよい |
| policy | - | 使用する実行ポリシー |
| init | - | 初期値 |
| unary_op | - | 入力範囲の各要素に適用される単項関数オブジェクト。戻り値の型は binary_op への入力として受け入れ可能でなければならない |
| binary_op | - | unary_op の結果、他の binary_op の結果、および提供されている場合は init に適用される二項関数オブジェクト |
| 型要件 | ||
-
InputIt
は
LegacyInputIterator
の要件を満たさなければならない
|
||
-
OutputIt
は
LegacyOutputIterator
の要件を満たさなければならない
|
||
-
ForwardIt1, ForwardIt2
は
LegacyForwardIterator
の要件を満たさなければならない
|
||
戻り値
書き込まれた最後の要素の次の要素を指すイテレータ。
計算量
与えられた N を std:: distance ( first, last ) として:
例外
ExecutionPolicy
という名前のテンプレートパラメータを持つオーバーロードは、
以下のようにエラーを報告します:
-
アルゴリズムの一部として呼び出された関数の実行が例外をスローした場合、
ExecutionPolicyが 標準ポリシー のいずれかであるとき、 std::terminate が呼び出されます。それ以外のExecutionPolicyについては、動作は実装定義です。 - アルゴリズムがメモリの確保に失敗した場合、 std::bad_alloc がスローされます。
注記
unary_op は init に適用されることはありません。
パラメータ init は最後に出現します。これは std::transform_exclusive_scan とは異なります。なぜなら、この関数ではオプションであるためです。
例
#include <functional> #include <iostream> #include <iterator> #include <numeric> #include <vector> int main() { std::vector data{3, 1, 4, 1, 5, 9, 2, 6}; auto times_10 = [](int x) { return x * 10; }; std::cout << "10 times exclusive sum: "; std::transform_exclusive_scan(data.begin(), data.end(), std::ostream_iterator<int>(std::cout, " "), 0, std::plus<int>{}, times_10); std::cout << "\n10 times inclusive sum: "; std::transform_inclusive_scan(data.begin(), data.end(), std::ostream_iterator<int>(std::cout, " "), std::plus<int>{}, times_10); std::cout << '\n'; }
出力:
10 times exclusive sum: 0 30 40 80 90 140 230 250 10 times inclusive sum: 30 40 80 90 140 230 250 310
関連項目
|
要素範囲の部分和を計算する
(関数テンプレート) |
|
|
要素範囲に関数を適用し、結果を出力範囲に格納する
(関数テンプレート) |
|
|
(C++17)
|
std::partial_sum
と同様だが、
i
th
番目の入力要素を
i
th
番目の和に含める
(関数テンプレート) |
|
(C++17)
|
呼び出し可能オブジェクトを適用した後、排他的スキャンを計算する
(関数テンプレート) |