std::for_each_n
ja.cppreference.net より
| ヘッダ <algorithm>
|
||
template< class InputIt, class Size, class UnaryFunc >
InputIt for_each_n( InputIt first, Size count, UnaryFunc f );
|
で定義 (1) | (C++20以降 constexpr) |
template< class ExecutionPolicy,
class ForwardIt, class Size, class UnaryFunc >
ForwardIt for_each_n( ExecutionPolicy&& policy,
ForwardIt first, Size count, UnaryFunc f );
|
(2) | (C++17以降) |
指定された呼び出し可能オブジェクト f を対象範囲 [first, std::next(first, count)) の各要素に適用します。f が結果を返す場合、その結果は無視されます。
1)
f は first から順に適用されます。UnaryFunc が MoveConstructible でない場合、動作は未定義です。2)
f は順に適用されない可能性があります。アルゴリズムは policy に従って実行されます。 他の 並列アルゴリズム とは異なり、
for_each_n は対象範囲の要素の任意のコピーを作成することが許可されていません。 このオーバーロードは、次の式の値が
true である場合にのみオーバーロード解決に関与します。
|
|
(C++20未満) |
|
|
(C++20以降) |
UnaryFunc が CopyConstructible でない場合、動作は未定義です。count >= 0 が true でない場合、動作は未定義です。
引数
| first | - | 対象範囲の先頭 |
| count | - | 対象範囲内の要素数 |
| f | - | 要素に適用する関数オブジェクト 関数のシグネチャは以下と同等である必要があります:
シグネチャに |
| policy | - | 使用する 実行ポリシー |
| 型要件 | ||
-InputIt は LegacyInputIterator の要件を満たす必要があります。
| ||
-ForwardIt は LegacyForwardIterator の要件を満たす必要があります。
| ||
-Size は整数型に変換可能である必要があります。
| ||
戻り値
std::next(first, count)
計算量
厳密に count 回の f の適用。
例外
2) 実行プロセス中:
- 並列化に必要な一時メモリリソースが利用できない場合、std::bad_alloc がスローされます。
- アルゴリズムの引数を介してオブジェクトにアクセス中にキャッチされない例外がスローされた場合、動作は実行ポリシーによって決まります(標準ポリシー の場合、std::terminate が呼び出されます)。
注記
イテレータ型(InputIt/ForwardIt)が変更可能な場合、f は対象範囲の要素を変更する可能性があります。
実装例
実装は libstdc++、libc++、および MSVC stdlib も参照してください。
template<class InputIt, class Size, class UnaryFunc>
InputIt for_each_n(InputIt first, Size count, UnaryFunc f)
{
for (Size i = 0; i < count; ++first, (void) ++i)
f(*first);
return first;
}
|
例
このコードを実行
#include <algorithm>
#include <iostream>
#include <vector>
void println(const auto& v)
{
for (auto count{v.size()}; const auto& e : v)
std::cout << e << (--count ? ", " : "\n");
}
int main()
{
std::vector<int> vi{1, 2, 3, 4, 5};
println(vi);
std::for_each_n(vi.begin(), 3, [](auto& n) { n *= 2; });
println(vi);
}
出力:
1, 2, 3, 4, 5
2, 4, 6, 4, 5
欠陥報告
以下の動作を変更する欠陥報告は、以前に公開されたC++標準に遡及的に適用されました。
| DR | 適用先 | 公開時の動作 | 修正後の動作 |
|---|---|---|---|
| LWG 3213 (P1718R2) |
C++17 | Size は整数型に変換可能である必要はなかった
|
必須とした |
参照
(C++20) |
関数オブジェクトをシーケンスの先頭N個の要素に適用します (アルゴリズム関数オブジェクト) |
| 単項 関数オブジェクト を 範囲 の要素に適用します&(関数テンプレート | |
ranges::for_each |
|
| transform 関数を要素の範囲に適用し、結果を宛先範囲に格納します&(関数テンプレート | |
ranges::transform |
|
(C++20)for range- ループ
|
(C++11) |