パープルハット

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

C++ for_each_n(使い方、for_eachとの違い)



std::for_each_nとは?

概要

  • 指定されたイテレータ範囲内の要素に関数を適用するための関数。
  • これにより、for文を使わずvector内の要素をすべて表示するといったことが可能になります。
  • 参考サイト:for_each_n - cpprefjp C++日本語リファレンス



std::for_eachとの違い

  • 動作そのものは同じだが、第二引数が違う
for_each 操作したいコンテナの最後のイテレータ
for_each_n 操作したい要素数



使用例1:vectorの全要素を表示

  • 今回使用するstd::for_eachの引数を以下の表に示します。
第1引数 先頭のイテレータ
第2引数 表示したい要素数(vector.size())
第3引数 ラムダ式 or 関数



ラムダ式使用の場合

表示するvectorをv1とします。

第1引数 v1.begin()
第2引数 表示したい要素数(vector.size())
第3引数 [](int x) { std::cout << x << std::endl; }

ソースコード

#include <iostream>
#include <algorithm>
#include <vector>

int main() {
    // 配列の宣言
    std::vector<int> v1{3, 5, 6, 7, 8};

    // 全要素を表示
    std::for_each_n(
        v1.begin(), 
        v1.size(), 
        [](int x) { std::cout << x << std::endl; }
    );
}


実行結果

3
5
6
7
8



関数使用の場合

  • ラムダ式の箇所を関数に置き換えるだけ。

ソースコード(実行結果は同じなため省略)

#include <iostream>
#include <algorithm>
#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_n(
        v1.begin(), 
        v1.size(), 
        display
    );
}





使用例2:vectorの先頭3つの要素を1だけ増やす(間接参照使用)

  • 引数に&をつけることで、transformのように各値を書き換えるといったことが可能になります。
  • 第3引数はラムダ式・関数のどちらでも構いません。
  • ↓↓加算処理を行うfor_each_nの引数
第1引数 v1.begin()
第2引数 3
第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_n(
        v1.begin(), 
        3, 
        [](int& x) { x+=1; }
    );

    // 表示
    std::for_each_n(
        v1.begin(), 
        v1.size(), 
        [](int x) { std::cout << x << std::endl; }
    );
}


実行結果

4
6
7
7
8