C++のラムダ式(Lambda Expression)とは?書き方・使い方をやさしく解説!
C++11から導入されたラムダ式(Lambda Expression)は、無名関数(名前のない関数)を簡潔に書ける便利な機能です。
ちょっとした関数をその場で定義できるため、コードがすっきりし、柔軟な処理が可能になります。
ラムダ式の基本構文
[キャプチャ] (引数) → 戻り値の型 { 関数本体 };
戻り値の型は省略可能です。最もシンプルなラムダ式は以下のように書けます:
auto func = []() {
cout << "Hello Lambda!" << endl;
};
func(); // 呼び出し
引数付きのラムダ式
auto add = [](int a, int b) {
return a + b;
};
cout << add(3, 4); // → 7
ラムダ式は関数のように、引数を受け取って値を返すことができます。
キャプチャ(外部変数の使用)
ラムダ式の外で定義された変数を使うには、キャプチャが必要です。
int x = 5;
auto f = [x]() {
cout << x << endl;
};
f();
キャプチャの種類
書き方 | 意味 |
[] | 何もキャプチャしない |
[x] | xを値渡しでキャプチャ |
[&x] | xを参照でキャプチャ |
[=] | すべての変数を値渡しでキャプチャ |
[&] | すべての変数を参照でキャプチャ |
関数にラムダ式を渡す
#include <algorithm>
#include <vector>
vector<int> nums = {3, 1, 4, 2};
sort(nums.begin(), nums.end(), [](int a, int b) {
return a > b;
});
このように、比較関数のようにちょっとした処理をその場で書きたいときに非常に便利です。
戻り値の型を明示する場合
auto divide = [](int a, int b) -> double {
return (double)a / b;
};
戻り値の型が複雑なときや、型推論できないときは -> 戻り値の型
を明記できます。
ラムダ式とstd::function
#include <functional>
std::function<int(int, int)> op;
op = [](int a, int b) { return a * b; };
cout << op(3, 5); // → 15
std::function
を使えば、ラムダ式を関数オブジェクトとして柔軟に扱えます。
ラムダ式のメリット
- 関数をその場で定義できる
- スコープを汚さずに一時的な処理が書ける
- コールバック処理やSTLアルゴリズムと相性が良い
注意点
- キャプチャの仕組みを正しく理解しないとバグの原因になる
- 複雑なラムダ式は可読性を下げることも
まとめ
C++のラムダ式は、簡潔で柔軟な関数処理を可能にする強力な機能です。
キャプチャや戻り値の扱いに注意しながら使えば、よりシンプルでメンテナンスしやすいコードが書けるようになります。
まずは `[](){}` から始めて、引数やキャプチャの使い方に慣れていきましょう!