ラムダ式: その場で作る関数
名前のない関数をその場で定義。コールバックやアルゴリズムに渡す短い処理に最適。
ラムダ式
名前のない関数をその場で定義する構文。
キャプチャ
外部変数をラムダ内で使えるようにする仕組み。
mutable
値キャプチャした変数を変更可能にするキーワード。
ラムダ式とは?
#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: 値キャプチャ});// 値キャプチャ(コピー)[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; }// デフォルトでは値キャプチャは constint counter = 0;auto f = [counter]() mutable { return ++counter; // mutable がないとエラー};
f(); // 1f(); // 2ジェネリックラムダ (C++14/20)
auto を使うと、任意の型を受け取れるラムダが作れる。
// C++14: ジェネリックラムダauto add = [](auto a, auto b) { return a + b; };
int i = add(1, 2); // int + intdouble 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: キャプチャ
外部変数をキャプチャして計算するラムダを作成してください。