std::for_each_nとは?
概要
- 指定されたイテレータ範囲内の要素に関数を適用するための関数。
- これにより、for文を使わずvector内の要素をすべて表示するといったことが可能になります。
- 参考サイト:for_each_n - cpprefjp C++日本語リファレンス
std::for_eachとの違い
- 動作そのものは同じだが、第二引数が違う
for_each | 操作したいコンテナの最後のイテレータ |
---|---|
for_each_n | 操作したい要素数 |
- for_eachについてもまとめたので参考にしてみてください⇒C++ std::for_each(使い方、transformとの違い) - パハットノート
使用例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