パープルハット

※当サイトではGoogleアドセンス広告を利用しています

C++ std::for_each(使い方、transformとの違い)



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