本文へスキップ
BecomeCoder

C++コース · 第15章 アルゴリズムとラムダ式 ― 処理を短く安全に · レッスン61

ラムダ式 ― その場で作る小さな関数

ブラウザで完結

導入

「ここだけで使う小さな関数」をわざわざ名前付きで定義するのは面倒です。ラムダ式を使うと、関数をその場に書けます。アルゴリズムに「処理」を渡すときの主役で、モダン C++ の書き味を大きく変えました。

説明

ラムダは [](引数) { 処理 } という形です。作ってすぐ呼ぶことも、変数に入れて何度も呼ぶこともできます。

flowchart LR
  l["[](int x){ return x*x; }"]
  cap["[ ] キャプチャ<br/>外の変数を取り込む"]
  arg["( ) 引数"]
  body["{ } 本体"]
  l --- cap
  l --- arg
  l --- body
#include <iostream>
using namespace std;

int main() {
    auto square = [](int x) { return x * x; };   // 変数に入れる
    cout << square(5) << endl;   // 25

    // その場で作って即実行することもできる
    cout << [](int a, int b) { return a + b; }(3, 4) << endl;   // 7
    return 0;
}

[ ] の部分は「キャプチャ」で、ラムダの外にある変数を中に取り込みます。[=] は値のコピー、[&] は参照で取り込みます。特定の変数だけ [factor] のように指定もできます。

#include <iostream>
using namespace std;

int main() {
    int factor = 10;

    auto times = [factor](int x) { return x * factor; };  // factor を取り込む
    cout << times(3) << endl;   // 30

    int sum = 0;
    auto add = [&sum](int x) { sum += x; };   // 参照で取り込み、外の sum を更新
    add(5); add(7);
    cout << sum << endl;   // 12
    return 0;
}

まとめ

ラムダ [](引数){処理} は、その場で作る名前のない関数です。[ ] のキャプチャで外の変数を取り込めます([=] コピー・[&] 参照)。次のレッスンで、これをアルゴリズムに渡す本領を見ます。

実際に動かしてみよう

下のエディタにC++を書いて「コンパイル & 実行」を押すと、ブラウザ内で本物のC++コンパイラ(clang + libc++)がその場でコンパイルして実行し、出力が表示されます。std::string・vector・クラス・テンプレート・STL などモダンC++がそのまま動きます。本文の例を書き換えて試しながら進めましょう(初回だけコンパイラの読み込みに時間がかかります。以降はキャッシュされます。この回は標準入力(cin)は使わず、値はコードに直接書きます)。

C/C++ — ブラウザ内で本物のコンパイラで実行

ブラウザ内で本物のC/C++コンパイラ(clang + libc++ / WebAssembly)を動かします。構造体・malloc/free・std::string・vector・クラス・テンプレート・STL などがそのまま実行できます(初回のみコンパイラの読み込みに時間がかかります。以降はブラウザにキャッシュされます)。
スクロールして表示された時点でも自動で読み込まれます。