Namespaces
Variants

std:: for_each_n

From cppreference.net
Algorithm library
Constrained algorithms and algorithms on ranges (C++20)
Constrained algorithms, e.g. ranges::copy , ranges::sort , ...
Execution policies (C++17)
Non-modifying sequence operations
Batch operations
for_each_n
(C++17)
Search operations
Modifying sequence operations
Copy operations
(C++11)
(C++11)
Swap operations
Transformation operations
Generation operations
Removing operations
Order-changing operations
(until C++17) (C++11)
(C++20) (C++20)
Sampling operations
(C++17)

Sorting and related operations
Partitioning operations
Sorting operations
Binary search operations
(on partitioned ranges)
Set operations (on sorted ranges)
Merge operations (on sorted ranges)
Heap operations
Minimum/maximum operations
Lexicographical comparison operations
Permutation operations
C library
Numeric operations
Operations on uninitialized memory
ヘッダーで定義 <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 >
ForwardIt for_each_n ( ExecutionPolicy && policy,

ForwardIt first, Size n, UnaryFunc f ) ;
(2) (C++17以降)

指定された関数オブジェクト f を範囲 [ first , first + n ) 内のすべてのイテレータをデリファレンスした結果に適用します。 f が結果を返す場合、その結果は無視されます。

1) f first から順に適用されます。
UnaryFunc MoveConstructible でない場合、動作は未定義です。
2) f は順不同で適用される可能性があります。アルゴリズムは policy に従って実行されます。
このオーバーロードは、以下の全ての条件が満たされる場合にのみオーバーロード解決に参加します:

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 であっても、シーケンス内の要素のコピーを作成することが許可されていません。

目次

パラメータ

first - 関数を適用する範囲の先頭
n - 関数を適用する要素の数
policy - 使用する 実行ポリシー
f - 関数オブジェクト。範囲 [ first , first + n ) 内のすべてのイテレータを間接参照した結果に適用される

関数のシグネチャは以下と同等であるべき:

void fun ( const Type & a ) ;

シグネチャは const & を持つ必要はない。
Type は、 InputIt 型のオブジェクトが間接参照可能であり、暗黙的に Type に変換可能である必要がある。

型要件
-
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 の要素に適用する
(関数テンプレート)
関数オブジェクトをシーケンスの最初のN個の要素に適用する
(アルゴリズム関数オブジェクト)