std::experimental::ranges:: for_each
|
ヘッダー
<experimental/ranges/algorithm>
で定義
|
||
|
template
<
InputIterator I, Sentinel
<
I
>
S,
class
Proj
=
ranges::
identity
,
IndirectUnaryInvocable
<
projected
<
I, Proj
>>
Fun
>
|
(1) | (ranges TS) |
|
template
<
InputRange R,
class
Proj
=
ranges::
identity
,
IndirectUnaryInvocable
<
projected
<
ranges::
iterator_t
<
R
>
, Proj
>>
Fun
>
|
(2) | (ranges TS) |
[
first
,
last
)
内の各イテレータをデリファレンスした値に射影
proj
を適用した結果に対して順次呼び出す(すなわち、
ranges::
invoke
(
f,
ranges::
invoke
(
proj,
*
i
)
)
を順に実行する)。
両方のオーバーロードにおいて、イテレータ型が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個の要素に適用する
(関数テンプレート) |