アルゴリズム for_each は、コレクションのすべての要素に関数を適用します。このアルゴリズムは 3 つの引数を使用します。最初の 2 つの引数は、評価されるシーケンスを定義する反復子を提供し、3 番目の引数は引数を 1 つ取る関数です。アルゴリズム for_each() は、シーケンスの各値に関数を適用し、その値を引数として渡します。
Function for_each (InputIterator first, InputIterator last, Function);
たとえば、print_if_leap() 関数を使用する次のコードは、1900 年から 1997 年までに発生する閏年のリストを印刷します。
cout << "leap years between 1990 and 1997 are: "; for_each (1990, 1997, print_if_leap); cout << endl;
引数の関数は、シーケンス内の要素ごとに 1 度だけ呼び出されます。for_each() アルゴリズム自体も第 3 の引数の値を返しますが、通常この値は無視されます。
注 : 第 3 の引数として渡される関数は、シーケンスを変更することができないので、印刷、大域変数や静的変数への値の割り当て、副作用を生成する他の関数の呼び出しなどの副作用によってしか結果を出すことができません。引数の関数が値を返しても無視されます。
次の例は、日付を表す integer 値の配列を検索して、ヴィンテージワインの年でもある閏年を決定します。
int vintageYears[] = {1947, 1955, 1960, 1967, 1994}; ... cout << "vintage years which were also leap years are: "; for_each (vintageYears, vintageYears + 5, print_if_leap); cout << endl;
副作用を印刷に限定する必要はありません。大文字の発生をカウントする関数 countCaps() を想定します。
int capCount = 0; void countCaps(char c) { if (isupper(c)) capCount++; }
次の例は、文字列値の中の大文字の数をカウントします。
string advice = "Never Trust Anybody Over 30!"; for_each(advice.begin(), advice.end(),countCaps); cout << "upper-case letter count is " << capCount << endl;