Namespaces
Variants

std::experimental::ranges:: for_each

From cppreference.net
ヘッダー <experimental/ranges/algorithm> で定義
template < InputIterator I, Sentinel < I > S, class Proj = ranges:: identity ,

IndirectUnaryInvocable < projected < I, Proj >> Fun >
ranges:: tagged_pair < tag:: in ( I ) , tag:: fun ( Fun ) >

for_each ( I first, S last, Fun f, Proj proj = Proj { } ) ;
(1) (ranges TS)
template < InputRange R, class Proj = ranges:: identity ,

IndirectUnaryInvocable < projected < ranges:: iterator_t < R > , Proj >> Fun >
ranges:: tagged_pair < tag:: in ( ranges:: safe_iterator_t < R > ) , tag:: fun ( Fun ) >

for_each ( R && r, Fun f, Proj proj = Proj { } ) ;
(2) (ranges TS)
1) 指定された関数オブジェクト f を、範囲 [ first , last ) 内の各イテレータをデリファレンスした値に射影 proj を適用した結果に対して順次呼び出す(すなわち、 ranges:: invoke ( f, ranges:: invoke ( proj, * i ) ) を順に実行する)。
2) (1) と同じですが、 r をソース範囲として使用します。これは ranges:: begin ( r ) first として、 ranges:: end ( r ) last として使用する場合と同じです。

両方のオーバーロードにおいて、イテレータ型がmutableの場合、 f はデリファレンスされたイテレータを通じて範囲の要素を変更することができます。 f が結果を返す場合、その結果は無視されます。

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

std::for_each とは異なり( MoveConstructible のみを要求します)、これらの関数は Fun CopyConstructible をモデル化することを要求します。

上記に示された宣言にもかかわらず、アルゴリズム宣言の実際のテンプレートパラメータの数と順序は未規定です。したがって、アルゴリズムを呼び出す際に明示的なテンプレート引数を使用する場合、プログラムはおそらく移植性がありません。

目次

パラメータ

first, last - 関数を適用する範囲
r - 関数を適用する範囲
f - 範囲内の各射影要素に適用する呼び出し可能オブジェクト
proj - 要素に適用する射影

戻り値

A tagged_pair オブジェクトは以下の2つのメンバーを含みます:

  • 最初のメンバーはタグ tag::in を持ち、ソース範囲の終端イテレータ(つまり、センチネル last と等価と比較される型 I のイテレータ)です。
  • 2番目のメンバーはタグ tag::fun を持ち、 std::move(f) から初期化されます(関数オブジェクトのすべての適用後)。

計算量

正確に last - first 回の f および proj の適用。

実装例

template<InputIterator I, Sentinel<I> S, class Proj = ranges::identity,
         IndirectUnaryInvocable<ranges::projected<I, Proj>> Fun>
auto for_each(I first, S last, Fun f, Proj proj = Proj{}) 
    -> ranges::tagged_pair<tag::in(I), tag::fun(Fun)>
{
    for (; first != last; ++first)
        ranges::invoke(f, ranges::invoke(proj, *first));
    return {std::move(first), std::move(f)};
}

関連項目

要素の範囲に関数を適用する
(関数テンプレート)
range- for ループ (C++11) 範囲に対するループを実行する
単項 関数オブジェクト 範囲 の要素に適用する
(関数テンプレート)
(C++17)
関数オブジェクトをシーケンスの最初のN個の要素に適用する
(関数テンプレート)