C++ のラムダ式
C++ 11 では、再利用されないため名前を必要としないコードの短いスニペットに使用できるインライン関数を許可するラムダ式が導入されました。最も単純な形式では、ラムダ式は次のように定義できます。
[ capture clause ] (parameters) ->戻り値の型 { メソッドの定義 }> 一般に、ラムダ式の戻り値の型はコンパイラ自体によって評価されるため、明示的に指定する必要はありません。また、 -> return-type 部分は無視できます。ただし、いくつかの複雑なケースでは、条件文の場合、コンパイラは戻り値の型を決定できないため、明示的な指定が必要です。
標準関数でのラムダ式のさまざまな使用法を以下に示します。
CPP
// C++ program to demonstrate lambda expression in C++> #include> using> namespace> std;> // Function to print vector> void> printVector(vector <> int> >v)>> {> > // lambda expression to print vector> > for_each(v.begin(), v.end(), [](> int> i)> > {> > std::cout < < i < <> ' '> ;> > });> > cout < < endl;> }> int> main()> {> > vector <> int> >{4, 1, 3, 5, 2, 3, 1, 7};>>' });> > cout < <> 'First number greater than 4 is : '> < < *p < < endl;> > // function to sort vector, lambda expression is for sorting in> > // non-increasing order Compiler can make out return type as> > // bool, but shown here just for explanation> > sort(v.begin(), v.end(), [](> const> int> & a,> const> int> & b) ->>> bool> > {> > return> a>b;>> > });> > printVector(v);> > // function to count numbers greater than or equal to 5> > int> count_5 = count_if(v.begin(), v.end(), [](> int> a)> > {> > return> (a>= 5);>> > < < count_5 < < endl;> > // function for removing duplicate element (after sorting all> > // duplicate comes together)> > p = unique(v.begin(), v.end(), [](> int> a,> int> b)> > {> > return> a == b;> > });> > // resizing vector to make size equal to total different number> > v.resize(distance(v.begin(), p));> > printVector(v);> > // accumulate function accumulate the container on the basis of> > // function provided as third argument> > int> arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};> > int> f = accumulate(arr, arr + 10, 1, [](> int> i,> int> j)> > {> > return> i * j;> > });> > cout < <> 'Factorial of 10 is : '> < < f < < endl;> > // We can also access function by storing this into variable> > auto> square = [](> int> i)> > {> > return> i * i;> > };> > cout < <> 'Square of 5 is : '> < < square(5) < < endl;> }> |
出力:
4 1 3 5 2 3 1 7 First number greater than 4 is : 5 7 5 4 3 3 2 1 1 The number of elements greater than or equal to 5 is : 2 7 5 4 3 2 1 Factorial of 10 is : 3628800 Square of 5 is : 25
ラムダ式は、外側のスコープから変数にアクセスできるため、通常の関数よりも強力な機能を持つことができます。次の 3 つの方法で、外側のスコープから外部変数をキャプチャできます。
参照によるキャプチャ
値によるキャプチャ
両方でキャプチャ(混合キャプチャ)
変数のキャプチャに使用される構文:
[&] : すべての外部変数を参照によってキャプチャします
[=] : すべての外部変数を値でキャプチャします
[a, &b] : a を値でキャプチャし、b を参照でキャプチャします
空のキャプチャ句 [ ] を持つラムダは、ローカルな変数にのみアクセスできます。
さまざまなキャプチャ方法を以下に示します。
CPP
// C++ program to demonstrate lambda expression in C++> #include> using> namespace> std;> int> main()> {> > vector <> int> >v1 = {3, 1, 7, 9};>> > vector <> int> >v2 = {10, 2, 7, 16, 9};>> > // access v1 and v2 by reference> > auto> pushinto = [&] (> int> m)> > {> > v1.push_back(m);> > v2.push_back(m);> > };> > // it pushes 20 in both v1 and v2> > pushinto(20);> > // access v1 by copy> > [v1]()> > {> > for> (> auto> p = v1.begin(); p != v1.end(); p++)> > {> > cout < < *p < <> ' '> ;> > }> > };> > int> N = 5;> > // below snippet find first number greater than N> > // [N] denotes, can access only N by value> > vector <> int> >:: イテレータ p = find_if(v1.begin(), v1.end(), [N](> int> i)> > {> > return> i>な;>>' < < *p < < endl;> > // function to count numbers greater than or equal to N> > // [=] denotes, can access all variable> > int> count_N = count_if(v1.begin(), v1.end(), [=](> int> a)> > {> > return> (a>= N);>> > < < count_N < < endl;> }> |
出力:
First number greater than 5 is : 7 The number of elements greater than or equal to 5 is : 3
注: ラムダ式は C++ 11 以降で使用できます。