Namespaces
Variants

std::for_each_n

ja.cppreference.net より
 
 
アルゴリズムライブラリ
制約付きアルゴリズムとレンジのアルゴリズム (C++20)
制約付きアルゴリズム、例: ranges::copy, ranges::sort, ...
ソートおよび関連操作
分割操作
(C++11)    

ソート操作
二分探索操作
(分割された範囲に対して)
集合操作 (ソート済み範囲に対して)
マージ操作 (ソート済み範囲に対して)
ヒープ操作
最小値/最大値操作
(C++11)
(C++17)
辞書順比較操作
順列操作


 
ヘッダ <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 である場合にのみオーバーロード解決に関与します。

std::is_execution_policy_v<std::decay_t<ExecutionPolicy>>

(C++20未満)

std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>>

(C++20以降)
UnaryFunc が CopyConstructible でない場合、動作は未定義です。

count >= 0 が true でない場合、動作は未定義です。

引数

first - 対象範囲の先頭
count - 対象範囲内の要素数
f - 要素に適用する関数オブジェクト

関数のシグネチャは以下と同等である必要があります:

void fun(const Type &a);

シグネチャに const & がある必要はありません。
型 Type は、InputIt 型のオブジェクトがデリファレンスされ、その後暗黙的に Type に変換できるようなものでなければなりません。

​

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 は整数型に変換可能である必要はなかった 必須とした

参照

関数オブジェクトをシーケンスの先頭N個の要素に適用します
(アルゴリズム関数オブジェクト)
単項 関数オブジェクト を 範囲
の要素に適用します&(関数テンプレート
transform
関数を要素の範囲に適用し、結果を宛先範囲に格納します&(関数テンプレート
(C++20)for range- ループ (C++11)
範囲に対するループを実行します