導入
「ここだけで使う小さな関数」をわざわざ名前付きで定義するのは面倒です。ラムダ式を使うと、関数をその場に書けます。アルゴリズムに「処理」を渡すときの主役で、モダン 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;
}
まとめ
ラムダ [](引数){処理} は、その場で作る名前のない関数です。[ ] のキャプチャで外の変数を取り込めます([=] コピー・[&] 参照)。次のレッスンで、これをアルゴリズムに渡す本領を見ます。