理解
ラムダ式は無名関数とも呼ばれ、C#とPythonにはすでに存在し、C ++ 11は開始されたばかりです。
ステートメント形式:
[キャプチャリスト](
パラメータリスト)可変例外->戻り値の型{関数本体}私中:
- キャプチャリスト:外部変数のリストをキャプチャします
- パラメータリスト:正式なパラメータリスト
- 可変インジケーター:キャプチャされた変数を変更するかどうか
- 例外:例外設定
- 戻り値の型:戻り値の型
- 機能本体:機能本体
その他の形式:
- [キャプチャリスト](パラメータリスト)->戻り値の型{関数本体}
- [キャプチャリスト](パラメータリスト){関数本体} //戻り値の型は戻り値に基づいて推測できます。戻り値の型が推測されない場合は無効です
- [キャプチャリスト] {関数本体} //パラメータのない関数に似ています
初挑戦
(ソートで使用):
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool cmp(int a, int b)
{
return a < b;
}
int main()
{
vector<int> myvec{ 3, 2, 5, 7, 3, 2 };
vector<int> lbvec(myvec);
sort(myvec.begin(), myvec.end(), cmp); // 旧式做法
cout << "predicate function:" << endl;
for (int it : myvec)
cout << it << ' ';
cout << endl;
sort(lbvec.begin(), lbvec.end(), [](int a, int b) -> bool { return a < b; }); // Lambda表达式
cout << "lambda expression:" << endl;
for (int it : lbvec)
cout << it << ' ';
}
さまざまなキャプチャフォーム:
バリューキャプチャ
キャプチャ後に値を変更することはできません。キャプチャされた変数の値は、Lambda式の作成時に値のコピーを介して渡されるため、変数を後で変更しても、Lambda式の値には影響しません。
#include <iostream>
using namespace std;
int main()
{
int a = 123;
auto f = [a] { cout << a << endl; };//不能改变lambda里面的a值
a = 321;
f(); // 输出:123
return 0;
}
参照キャプチャ
キャプチャ後に値を変更できます。同時に、キャプチャした値を後で変更すると、その値にも影響します。
#include <iostream>
using namespace std;
int main()
{
int a = 123;
auto f = [&a] { cout << a << endl; };
a = 321;
f(); // 输出:321
}
暗黙のキャプチャ:
コンパイラは、関数本体のコードに基づいて、どの変数をキャプチャする必要があるかを推測します。このメソッドは、暗黙的なキャプチャと呼ばれます。暗黙的なキャプチャには、[=]と[&]の2つの方法があります。[=]は値キャプチャによって外部変数をキャプチャすることを意味し、[&]は参照キャプチャによって外部変数をキャプチャすることを意味します。
暗黙的な値のキャプチャ:
#include <iostream>
using namespace std;
int main()
{
int a = 123;
auto f = [=] { cout << a << endl; }; // 隐式值捕获
f(); // 输出:123
}
暗黙の参照キャプチャ:
int main()
{
int a = 123;
auto f = [&] { cout << a << endl; }; // 隐式引用捕获
a = 321;
f(); // 输出:321
}
可変:値によってキャプチャされた値を変更できます:
#include <iostream>
using namespace std;
int main()
{
int a = 123;
auto f = [a]()mutable { cout << ++a; }; // 不会报错
cout << a << endl; // 输出:123,值捕获,不影响后面的值
f(); // 输出:124
}