名前空間
変種
操作

std::for_each_n

From cppreference.com
< cpp‎ | algorithm
 
 
アルゴリズムライブラリ
制約付きアルゴリズムとRangeアルゴリズム (C++20)
制約付きアルゴリズム、例: ranges::copy, ranges::sort, ...
実行ポリシー (C++17)
シーケンスを変更しない操作
一括操作
for_each_n
(C++17)
検索操作
(C++11)                (C++11)(C++11)

シーケンスを変更する操作
コピー操作
(C++11)
(C++11)
スワップ操作
変換操作
生成操作
削除操作
順序変更操作
(C++17まで)(C++11)
(C++20)(C++20)
サンプリング操作
(C++17)

ソートおよび関連操作
パーティション操作
ソート操作
二分探索操作
(パーティション化された範囲)
集合操作 (ソート済み範囲)
マージ操作 (ソート済み範囲)
ヒープ操作
最小/最大操作
(C++11)
(C++17)
辞書順比較操作
順列操作
Cライブラリ
数値演算
未初期化メモリに対する操作
 
ヘッダー <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 を、範囲 [firstfirst + n) 内の各イテレータを間接参照した結果に適用します。 f が結果を返しても、その結果は無視されます。

1) ffirst から順に適用されます。
UnaryFuncMoveConstructible でない場合、動作は未定義です。
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以降)
UnaryFuncCopyConstructible でない場合、動作は未定義です。

もし n >= 0true でない場合、動作は未定義です。

イテレータの型 (InputIt/ForwardIt) がミュータブルである場合、f は間接参照されたイテレータを通して範囲の要素を変更する可能性があります。

他の並列アルゴリズムとは異なり、for_each_n は、要素が TriviallyCopyable であっても、シーケンスの要素のコピーを作成することは許可されていません。

目次

[edit] パラメータ

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

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

 void fun(const Type &a);

シグネチャは const & を持つ必要はありません。
 Type 型は、InputIt 型のオブジェクトを間接参照してから  Type 型に暗黙的に変換できるような型でなければなりません。

型要件
-
InputItLegacyInputIterator の要件を満たす必要があります。
-
ForwardItLegacyForwardIterator の要件を満たさなければなりません。
-
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) 範囲に対するループを実行する[編集]
範囲内の要素に単項関数オブジェクトを適用する
(関数テンプレート) [編集]
シーケンスの最初のN個の要素に関数オブジェクトを適用する
(アルゴリズム関数オブジェクト)[編集]
English 日本語 中文(简体) 中文(繁體)