ラムダ式とは
C++のラムダ式は、匿名関数を作成するための構文です。
ラムダ式を使用すると、その場で関数オブジェクトを定義でき、短いコードで高機能な処理を実現できます。
ちなみにラムダ式は、C++11からで導入されました。
概要
ラムダ式は次のような構文で記述されます。
[capture](parameters) -> return_type {
body
}
- capture
-
外部変数をラムダ式内で使用するためのリスト。値キャプチャ(
[=]
)、参照キャプチャ([&]
)、特定の変数を指定してキャプチャすることができます。 - parameters
-
関数の引数リスト。
- return_type
-
戻り値の型。省略可能で、ラムダ式の内容から推論されることも多いです。
- body
-
ラムダ式の本体、実行されるコードブロック。
利点
- 簡潔なコード
-
ラムダ式を使うことで、コードを簡潔に記述できます。特に短い関数やコールバック関数をその場で定義したい場合に便利です。
- 匿名関数
-
ラムダ式は名前を持たない匿名関数を作成するためのものです。これにより、一時的な関数オブジェクトを定義し、その場で使用することができます。
- 可読性の向上
-
ラムダ式を使用すると、関数の定義と使用が近くにあるため、コードの可読性が向上します。特に、関数オブジェクトを別の場所に定義する必要がない場合に有用です。
- キャプチャによる柔軟性
-
ラムダ式は外部変数をキャプチャできるため、外部のコンテキストを簡単に使用することができます。値キャプチャ、参照キャプチャ、またはそれらの組み合わせを使用して柔軟なコードを記述できます。
- 高度なSTL操作
-
ラムダ式は標準ライブラリ(STL)のアルゴリズムと組み合わせると非常に強力です。特に、
std::for_each
、std::transform
、std::sort
などのアルゴリズム関数と共に使用することで、強力なデータ操作をシンプルなコードで実現できます。
実装例
基本的なラムダ式
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
// 基本的なラムダ式
auto greet = []() {
std::cout << "Hello, World!" << std::endl;
};
// ラムダ式の呼び出し
greet();
return 0;
}
実行結果
Hello, World!
引数を取るラムダ式
#include <iostream>
int main() {
// 引数を取るラムダ式
auto add = [](int a, int b) -> int {
return a + b;
};
int result = add(5, 3);
std::cout << "5 + 3 = " << result << std::endl;
return 0;
}
実行結果
5 + 3 = 8
外部変数をキャプチャするラムダ式
#include <iostream>
int main() {
int x = 10;
int y = 20;
// 値キャプチャ
auto add_value_capture = [x, y]() -> int {
return x + y;
};
std::cout << "Value capture: " << add_value_capture() << std::endl;
// 参照キャプチャ
auto add_reference_capture = [&x, &y]() -> int {
return x + y;
};
// x, y を変更
x = 30;
y = 40;
std::cout << "Reference capture: " << add_reference_capture() << std::endl;
return 0;
}
実行結果
Value capture: 30
Reference capture: 70
標準ライブラリと組み合わせた例
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> numbers = {1, 2, 3, 4, 5};
// 標準ライブラリのアルゴリズムにラムダ式を使用
std::for_each(numbers.begin(), numbers.end(), [](int n) {
std::cout << n * n << " ";
});
std::cout << std::endl;
return 0;
}
実行結果
1 4 9 16 25