名前空間
変種
操作

std::experimental::ranges::for_each

From cppreference.com
< cpp‎ | experimental‎ | ranges
 
 
 
 
 
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を、範囲 [firstlast) 内の各イテレータを逆参照した結果(すなわち、ranges::invoke(f, ranges::invoke(proj, *i)))に適用します。順番に適用されます。
2) (1) と同様ですが、ソース範囲としてrを使用し、あたかも ranges::begin(r)first として、ranges::end(r)last として使用するかのようです。

両方のオーバーロードにおいて、イテレータ型がミュータブルである場合、f は、逆参照されたイテレータを通じて範囲の要素を変更する可能性があります。f が結果を返す場合、その結果は無視されます。

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

std::for_eachMoveConstructible のみが必要)とは異なり、これらの関数は FunCopyConstructible をモデル化することを要求します。

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

目次

[編集] パラメータ

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

[編集] 戻り値

以下の2つのメンバーを含む `tagged_pair` オブジェクト

  • `tag::in` タグを持つ最初のメンバーは、ソース範囲の末尾を過ぎたイテレータです(つまり、セマンティック last と等価な `I` 型のイテレータ)。
  • `tag::fun` タグを持つ2番目のメンバーは、`std::move(f)` から初期化されます(関数オブジェクトのすべての適用後)。

[編集] 計算量

f および proj の適用は、ちょうど last - first 回です。

[編集] 考えられる実装

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)};
}

[編集]

[編集] 関連項目

要素の範囲に関数を適用する
(function template) [編集]
範囲forループ(C++11) 範囲に対するループを実行する[編集]
範囲内の要素に単項関数オブジェクトを適用する
(関数テンプレート) [編集]
シーケンスの最初のN個の要素に関数オブジェクトを適用する
(関数テンプレート) [編集]
English 日本語 中文(简体) 中文(繁體)