std::for_eachとは?
概要
- 指定されたイテレータ範囲内の要素に関数を適用するための関数。
- これにより、for文を使わずvector内の要素をすべて表示するといったことが可能になります。
- 参考サイト:for_each - cpprefjp C++日本語リファレンス
std::transformとの違い
- std::transformはvectorそのもの書き換えることがメインです。
- 詳細に話すと、transformは返り値を持つ関数・ラムダ式を引数に取ります。
- 一方、for_eachの関数・ラムダ式は返り値なしですが、一応間接参照で引数とれば値を書き換えることは可能です。
- transformについてもまとめたので参考にしてみてください⇒C++ std::transformの使い方 - パハットノート
使用例1:vectorの全要素を表示
- 今回使用するstd::for_eachの引数を以下の表に示します。
第1引数 | イテレータの先頭 |
---|---|
第2引数 | イテレータの末尾 |
第3引数 | ラムダ式 or 関数 |
ラムダ式使用の場合
表示するvectorをv1とします。
第1引数 | v1.begin() |
---|---|
第2引数 | v1.end() |
第3引数 | [](int x) { std::cout << x << std::endl; } |
ソースコード
#include <algorithm> #include <iostream> #include <vector> int main() { // 配列の宣言 std::vector<int> v1{3, 5, 6, 7, 8}; // 表示 std::for_each( v1.begin(), v1.end(), [](int x) { std::cout << x << std::endl; } ); }
実行結果
3 5 6 7 8
関数使用の場合
- ラムダ式の箇所を関数に置き換えるだけ。
ソースコード(実行結果は同じなため省略)
#include <algorithm> #include <iostream> #include <vector> // 引数を表示する関数 void display(int n){ std::cout << n << std::endl; } int main() { // 配列の宣言 std::vector<int> v1{3, 5, 6, 7, 8}; // 表示 std::for_each( v1.begin(), v1.end(), display ); }
使用例2:vectorの総和を計算
- vectorの総和をsumという変数に格納します。
第1引数 | v1.begin() |
---|---|
第2引数 | v1.end() |
第3引数 | [](int x) { sum += x; } |
ソースコード
#include <algorithm> #include <iostream> #include <vector> // 総和を格納する変数 int sum = 0; int main() { // 配列の宣言 std::vector<int> v1{3, 5, 6, 7, 8}; // 総和を求める std::for_each( v1.begin(), v1.end(), [](int x) { sum += x; } ); // sumを表示 std::cout << "sum = " << sum << std::endl; }
実行結果
sum = 29
使用例3:vectorの各要素を1だけ増やす(間接参照使用)
- 引数に&をつけることで、transformのように各値を書き換えるといったことが可能になります。
- 第3引数はラムダ式・関数のどちらでも構いません。
第1引数 | v1.begin() |
---|---|
第2引数 | v1.end() |
第3引数 | [](int& x) { x+=1; } |
ソースコード
#include <iostream> #include <algorithm> #include <vector> int main() { // 配列の宣言 std::vector<int> v1{3, 5, 6, 7, 8}; // 各要素を1だけ増やす std::for_each( v1.begin(), v1.end(), [](int& x) { x+=1; } ); // 表示 std::for_each( v1.begin(), v1.end(), [](int x) { std::cout << x << std::endl; } ); }
実行結果
4 6 7 8 9