std::for_each_n
| ヘッダー <algorithm> で定義 |
||
| template< class InputIt, class Size, class UnaryFunc > InputIt for_each_n( InputIt first, Size n, UnaryFunc f ); |
(1) | (C++17以降) (C++20 以降 constexpr) |
| template< class ExecutionPolicy, class ForwardIt, class Size, class UnaryFunc > |
(2) | (C++17以降) |
与えられた関数オブジェクト f を、範囲 [first, first + n) 内の各イテレータを間接参照した結果に適用します。 f が結果を返しても、その結果は無視されます。
UnaryFunc が MoveConstructible でない場合、動作は未定義です。|
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以降) |
UnaryFunc が CopyConstructible でない場合、動作は未定義です。もし n >= 0 が true でない場合、動作は未定義です。
イテレータの型 (InputIt/ForwardIt) がミュータブルである場合、f は間接参照されたイテレータを通して範囲の要素を変更する可能性があります。
他の並列アルゴリズムとは異なり、for_each_n は、要素が TriviallyCopyable であっても、シーケンスの要素のコピーを作成することは許可されていません。
目次 |
[edit] パラメータ
| first | - | 関数を適用する範囲の開始 |
| n | - | 関数を適用する要素数 |
| policy | - | 使用する 実行ポリシー |
| f | - | 関数オブジェクト。範囲 [first, first + n) 内の各イテレータを間接参照した結果に適用されます。関数のシグネチャは以下と同等である必要があります。 void fun(const Type &a); シグネチャは const & を持つ必要はありません。 |
| 型要件 | ||
-InputIt は LegacyInputIterator の要件を満たす必要があります。 | ||
-ForwardIt は LegacyForwardIterator の要件を満たさなければなりません。 | ||
-Size は整数型に変換可能でなければなりません。 | ||
[edit] 戻り値
first + n に等しいイテレータ、またはより形式的には std::advance(first, n) に等しいイテレータ。
[edit] 計算量
n 回の f の適用。
[edit] 例外
テンプレートパラメータ ExecutionPolicy を持つオーバーロードは、次のようにエラーを報告します。
- アルゴリズムの一部として呼び出された関数の実行が例外をスローし、
ExecutionPolicyが 標準ポリシー のいずれかである場合、std::terminate が呼び出されます。その他のExecutionPolicyの場合、動作は実装定義です。 - アルゴリズムがメモリの割り当てに失敗した場合、std::bad_alloc がスローされます。
[edit] 実装例
libstdc++、libc++、MSVC stdlib の実装も参照してください。
template<class InputIt, class Size, class UnaryFunc> InputIt for_each_n(InputIt first, Size n, UnaryFunc f) { for (Size i = 0; i < n; ++first, (void) ++i) f(*first); return first; } |
[edit] 例
#include <algorithm> #include <iostream> #include <vector> void println(auto const& 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
[edit] 関連項目
| 範囲内の要素に関数を適用し、結果を結果範囲に格納する (関数テンプレート) | |
範囲forループ(C++11) |
範囲に対するループを実行する |
| 範囲内の要素に単項関数オブジェクトを適用する (関数テンプレート) | |
| (C++20) |
シーケンスの最初のN個の要素に関数オブジェクトを適用する (アルゴリズム関数オブジェクト) |