GeezerVison is showing cpprefjp.github.io — std::for_each - cpprefjp C++日本語リファレンス
最終更新日時:
2026年09月20日 18時40分00秒 (JST)
rotarymars
が更新
履歴
編集
function template
<algorithm>
std:: for_each
namespace std {
template < class InputIterator , class Function >
Function for_each ( InputIterator first ,
InputIterator last ,
Function f ); // (1) C++98
template < class InputIterator , class Function >
constexpr Function for_each ( InputIterator first ,
InputIterator last ,
Function f ); // (1) C++20
template < class ExecutionPolicy , class ForwardIterator , class Function >
void for_each ( ExecutionPolicy && exec ,
ForwardIterator first ,
ForwardIterator last ,
Function f ); // (2) C++17
}
概要
イテレータ範囲[first, last)の全ての要素に、指定された関数を適用する。
要件
Function は MoveConstructible の要件を満たす必要があるが、CopyConstructible の要件を満たす必要はない。(C++11のみ)
効果
[first,last) 内の全てのイテレータ i に f(*i) という操作を行う。first から順番に処理し、last - 1 まで行う。
このアルゴリズムはその他のアルゴリズムと違い、関数 f の内部で *i の値を書き換えても構わない(もちろんイテレータの型が mutable iterator の要件を満たしている場合に限る)。
戻り値
C++98 の場合 : f
C++11 の場合 : std::move(f)
計算量
正確に f を last - first 回適用する
備考
f に戻り値がある場合、それは単に無視される
(1)は、戻り値の型がFunctionとなっている。シングルスレッドでの順次実行では関数オブジェクトfの状態を次々に変更していき、最終的な関数オブジェクトの状態を戻り値として取得できる
(2)の並列アルゴリズム版は、戻り値の型がFunctionではなくvoidとなっている。並列数だけ関数オブジェクトをコピーするため、関数オブジェクトの状態を順次変更していくような設計は、並列アルゴリズム版ではできないようになっている
例
C++98での例
出力
3
1
4
----
3
2
6
例
C++11での例
出力
3
1
4
----
3
2
6
処理系
Clang : 9.0.1 ✅
GCC : 9.1.0 ✅
Visual C++ : 2005 ✅ , 2008 ✅ , 2010 ✅ , 2012 ✅ , 2013 ✅ , 2015 ✅
C++11への対応(戻り値のムーブ)は2012から。
実装例
template < class InputIterator , class Function >
Function for_each ( InputIterator first , InputIterator last , Function f ) {
for ( ; first != last ; ++ first )
f ( * first );
return move ( f );
}
関連項目
参照