C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++11のラムダ式とは?匿名関数の基本と使い方をわかりやすく解説

C++のSTL(標準テンプレートライブラリ)には、std::for_eachのような便利な汎用関数が多数含まれています。しかし、これらの関数は使い勝手がやや煩雑な場合があります。特に、適用したい関数オブジェクト(ファンクタ)がその関数専用の一時的なものである場合、そのためだけに名前付き関数を定義しなければならず、コードが冗長になりがちです。

この問題を解決するのが「匿名関数(無名関数)」です。C++11ではラムダ式が導入され、その場で簡単に匿名関数を作成できるようになりました。

ラムダ式の使用例

以下は、ラムダ式を使ってベクター内の各要素を2乗して出力する例です。

#include<iostream>
#include<vector>
#include <algorithm> // for_each

using namespace std;

int main() {
    vector<int> myvector;
    myvector.push_back(1);
    myvector.push_back(2);
    myvector.push_back(3);

    for_each(myvector.begin(), myvector.end(), [](int x) {
        cout << x*x << endl;
    });
}

実行結果

このプログラムを実行すると、次の出力が得られます。

1
4
9

ラムダ式の構成要素

(int x) の部分は、ラムダ式が呼び出される際に受け取る引数を定義しています。

[] の部分は、ローカルスコープにある変数をラムダ式の内部スコープへ渡すために使われます。この仕組みは変数のキャプチャと呼ばれます。たとえば [=] と書けば外部の変数を値渡しで、[&] と書けば参照渡しでキャプチャできます。

また、単純な式であれば戻り値の型は自動的に推論されます。型を明示的に指定したい場合は、次のような構文を使用します。

戻り値の型を明示する構文

[](int x) -> double {
    return x/2.0;
}

このように -> に続けて戻り値の型を記述することで、コンパイラに明示的に型情報を伝えることができます。

C++のラムダ式についてさらに詳しく学びたい方は、StackOverflowの以下のスレッドも参考になります。
What is a lambda expression in C++11? - StackOverflow

  1. C#の列挙型(Enum)とは?基本的な使い方をサンプルコード付きで解説

    C#における列挙型(Enum:Enumeration)は、曜日、月、季節、製品カテゴリなど、関連する一連の名前付き定数をひとつのグループとして格納するためのデータ型です。Enumの定数にはデフォルトで0から始まる整数値が自動的に割り当てられ、宣言された順番に1ずつ増加していきます。定数のセットは固定されており、ループ処理などで簡単に走査(トラバース)できるのも大きな特徴です。Enumの基本的な特徴関連する名前付き定数をひとまとめに管理できる最初の定数にはデフォルトで「0」が割り当てられ、以降は1ずつ増加する値は明示的に変更することも可能型安全性が高く、無効な値の代入をコンパイル時に防げるEnu

  2. Pythonのラムダバインディングとは?仕組みとデフォルト引数の使い方を解説

    ラムダバインディングとはプログラムや関数のステートメントが実行されると、仮引数(formal parameters)の現在の値はスタック上に保存されます。そして、そのステートメントのスコープ内では、仮引数は呼び出し時に渡された実引数(actual arguments)の値へと束縛(バインド)されます。ステートメントを抜ける際には、保存しておいた元の値が復元されます。このプロトコルは完全に再帰的です。つまり、関数本体の中で仮引数が新しい値に再束縛されるような処理が行われても、ラムダバインディングの仕組みによって、すべてが秩序正しく処理されることが保証されています。変数xへの束縛は1つだけここで重