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

C/C++におけるラムダ関数の重要性とは?基本構文とキャプチャの使い方を解説

ラムダ関数(Lambda Function)とは、メインプログラムのスコープ外に関数本体を持たず、その場で定義できるインライン関数です。

ラムダ関数は、変数に格納できる「値」としても扱えます。また、関数のように呼び出せるオブジェクトとして参照することもでき、このようなオブジェクトはファンクタ(functor)と呼ばれます。

コンパイラがラムダ関数の定義を見つけると、通常、そのラムダ専用のカスタムオブジェクトが生成されます。

ラムダ関数は通常の関数よりも多くの機能を備えています。たとえば「キャプチャ」という仕組みにより、周囲のスコープで使われている変数を取り込むことができます。キャプチャされた変数は、そのオブジェクトのメンバとして扱われます。

ラムダ関数は「関数オブジェクト」とも呼ばれ、独自のスコープを持ち、通常の関数の引数として渡すことも可能です。さらに、ラムダ関数には固有のライフタイム(生存期間)があります。

ラムダ式の構成要素

  • [ ] … キャプチャ節(Capture)
  • ( ) … パラメータリスト(省略可能)
  • -> … 戻り値の型(省略可能)
  • {...} … 関数本体

ラムダの基本構文

[](int a) -> int { return a-1; };

この例では、引数 a を受け取り、a-1 を返すシンプルなラムダ式を定義しています。

キャプチャの2つの方法

キャプチャとは、ラムダ関数に対して、そのスコープやネストされたブロック内で利用可能な変数へのアクセス権を与えるための節です。変数をキャプチャする方法は主に次の2つがあります。

1. 名前による値キャプチャ

変数名を [ ] 内に記述すると、ラムダ関数の中にその変数のローカルコピーが作られます。

int main(){
    set s;
    // setに要素を追加
    int i = 20;
    for_each(s.begin(), s.end(), [i](T& elem){
        cout << elem.getVal() * i << endl;
    });
}

上記の例では、ラムダ関数のローカルコピーを作ることで変数 i をキャプチャしています。コピーなので、ラムダ内で値を書き換えても元の変数には影響しません。

2. 参照によるキャプチャ(&)

変数の前に & を付けると参照キャプチャとなり、ラムダ関数は外側のコンテキストを直接操作します。そのため、キャプチャした値の読み書きが可能になります。

int main(){
    set s;
    // setに要素を追加
    int result = 0;
    for_each(s.begin(), s.end(), [&result](T& elem){ result += elem.getVal(); });
    cout << result << endl;
}

この例では result を参照キャプチャしているため、各要素の処理ごとに合計値が実際に更新されます。

メンバ関数内でラムダを使う

ラムダ関数は、任意の通常の関数の引数として使えるだけでなく、クラスのメンバ関数内でも利用できます。[this] をキャプチャすれば、クラスのメンバ変数やメンバ関数にもアクセス可能です。

class func{
public:
    func(set<T> s): s1(s){}
    void func(){
        remove_if(s1.begin(), s1.end(),
            [this](int i) -> bool { return (i < level); });
    }
private:
    set<T> s1;
    int level;
};

この例では [this] によってクラス自身へのポインタをキャプチャし、メンバ変数 level と比較する条件をラムダ内で実現しています。

まとめ

C/C++のラムダ関数は、その場で定義できる軽量な関数オブジェクトであり、STLアルゴリズム(for_each や remove_if など)と組み合わせることで、簡潔で読みやすいコードを実現します。値キャプチャと参照キャプチャを使い分けることで、外部の変数を柔軟かつ安全に扱える点が大きな魅力です。

  1. C/C++のmbsrtowcs()関数とは?構文・パラメータ・戻り値と実例を解説

    本記事では、C++ STLに含まれるstd::mbsrtowcs()関数の仕組み、構文、および具体的な使用例について詳しく解説します。 std::mbsrtowcs()とは? std::mbsrtowcs()は、C++ STLに組み込まれている関数で、<cwchar>ヘッダーファイル内で定義されています。関数名のmbsrtowcs()は「multibyte string to wide character string(マルチバイト文字列からワイド文字列への変換)」を意味し、再開可能な変換状態を維持しながら、NULL終端されたマルチバイト文字列をワイド文字列表現へと変換します。この

  2. C/C++のsystem()関数とは?使い方と実行例を徹底解説

    この記事では、C/C++におけるsystem()関数の基本的な使い方と動作について、具体例を交えながら詳しく解説します。 system()関数は、C/C++標準ライブラリに含まれる関数の一つです。オペレーティングシステムのコマンドプロセッサ(コマンドプロンプト)やターミナルで実行可能なコマンドをプログラムから渡して実行でき、コマンドの処理が完了すると制御をプログラムに戻します。 この関数を使用するには、ヘッダーファイル<stdlib.h>(C++の場合は<cstdlib>)をインクルードする必要があります。 構文 system()関数の構文は以下の通りです。 int