ラムダ式: その場で作る関数

名前のない関数をその場で定義。コールバックやアルゴリズムに渡す短い処理に最適。

ラムダ式
名前のない関数をその場で定義する構文。
キャプチャ
外部変数をラムダ内で使えるようにする仕組み。
mutable
値キャプチャした変数を変更可能にするキーワード。

ラムダ式とは?

使い捨てメモ

ラムダ式は「使い捨てメモ」のようなもの。正式な文書(関数定義)を作るほどでもない短い処理を、使う場所にそのまま書ける。

Basic Lambda
#include <algorithm>
#include <vector>
int main() {
std::vector<int> nums = {3, 1, 4, 1, 5};
// 基本構文: [キャプチャ](引数) -> 戻り値 { 本体 }
std::sort(nums.begin(), nums.end(), [](int a, int b) {
return a > b; // 降順
});
}
C++11: ラムダ式は C++11 で導入された。それ以前は関数オブジェクト(ファンクタ)を使う必要があった。

キャプチャ: 外部変数を取り込む

ラムダ式の外にある変数を使いたい時は「キャプチャ」する。[]の中にキャプチャ方法を指定。

Bad
// ❌ Bad: ローカル変数にアクセスできない
int threshold = 3;
std::count_if(nums.begin(), nums.end(), [](int n) {
return n > threshold; // エラー: threshold は見えない
});
Good
// ✅ Good: キャプチャで外部変数を取り込む
int threshold = 3;
std::count_if(nums.begin(), nums.end(), [threshold](int n) {
return n > threshold; // OK: 値キャプチャ
});
キャプチャの種類

値キャプチャ(コピー)は手紙のコピーを渡す。参照キャプチャは住所を渡す。ラムダが長生きする場合は値キャプチャが安全。

Capture Syntax
// 値キャプチャ(コピー)
[threshold](int n) { return n > threshold; }
// 参照キャプチャ
[&threshold](int n) { return n > threshold; }
// 全て値キャプチャ
[=](int n) { return n > threshold; }
// 全て参照キャプチャ
[&](int n) { return n > threshold; }
// ミックス
[=, &counter](int n) { ++counter; return n > threshold; }
mutable Keyword
// デフォルトでは値キャプチャは const
int counter = 0;
auto f = [counter]() mutable {
return ++counter; // mutable がないとエラー
};
f(); // 1
f(); // 2

ジェネリックラムダ (C++14/20)

auto を使うと、任意の型を受け取れるラムダが作れる。

Generic Lambda
// C++14: ジェネリックラムダ
auto add = [](auto a, auto b) { return a + b; };
int i = add(1, 2); // int + int
double d = add(1.5, 2.5); // double + double
// C++20: テンプレートラムダ
auto typed = []<typename T>(T a, T b) { return a + b; };

合格ライン

ラムダの基本構文を書ける
[=] と [&] の違いを説明できる
std::sort にラムダを渡せる

参考リンク

演習課題

課題1: sort + lambda
ラムダ式を使って構造体のvectorをカスタムソートしてください。
課題2: キャプチャ
外部変数をキャプチャして計算するラムダを作成してください。

次のステップ