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
が結果を返す場合、その結果は無視されます。
|
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以降) |
n >= 0 が true でない場合、動作は未定義です。
イテレータ型(
InputIt
/
ForwardIt
)が変更可能な場合、
f
はデリファレンスされたイテレータを通じて範囲の要素を変更する可能性があります。
他の並列アルゴリズムとは異なり、
for_each_n
は、要素が
TriviallyCopyable
であっても、シーケンス内の要素のコピーを作成することが許可されていません。
目次 |
パラメータ
| first | - | 関数を適用する範囲の先頭 |
| n | - | 関数を適用する要素の数 |
| policy | - | 使用する 実行ポリシー |
| f | - |
関数オブジェクト。範囲
[
first
,
first
+
n
)
内のすべてのイテレータを間接参照した結果に適用される
関数のシグネチャは以下と同等であるべき: void fun ( const Type & a ) ;
シグネチャは
const
&
を持つ必要はない。
|
| 型要件 | ||
-
InputIt
は
LegacyInputIterator
の要件を満たさなければならない。
|
||
-
ForwardIt
は
LegacyForwardIterator
の要件を満たさなければならない。
|
||
-
Size
は整数型に変換可能でなければならない。
|
||
戻り値
first
に
n
を加えたイテレータ、あるいはより形式的には
std::
advance
(
first, n
)
と等しいイテレータ。
計算量
厳密に n 回の f の適用。
例外
ExecutionPolicy
という名前のテンプレートパラメータを持つオーバーロードは、
以下のようにエラーを報告します:
-
アルゴリズムの一部として呼び出された関数の実行が例外をスローした場合、
ExecutionPolicyが 標準ポリシー のいずれかであるとき、 std::terminate が呼び出される。それ以外のExecutionPolicyについては、動作は実装定義である。 - アルゴリズムがメモリの確保に失敗した場合、 std::bad_alloc がスローされる。
実装例
実装については 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; } |
例
#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
関連項目
|
要素の範囲に関数を適用し、結果を宛先範囲に格納する
(関数テンプレート) |
|
range-
for
loop
(C++11)
|
範囲に対するループを実行する |
|
単項
function object
を
range
の要素に適用する
(関数テンプレート) |
|
|
(C++20)
|
関数オブジェクトをシーケンスの最初のN個の要素に適用する
(アルゴリズム関数オブジェクト) |