lambda函数
格式
[捕捉列表] (参数) mutable -> 返回值类型 {函数体}
lambda 表达式是一种匿名函数,即没有函数名的函数;该匿名函数是由数学中的λ演算而来的。
种类
- []{} 最简单的lambda函数
- [var] 表示以值传递方式捕捉变量var
int main() {
int x = 5;
auto f = [x]{
//x is read-only
int y;
y = x + 1;
std::cout << y << std::endl;
};
f();
return 0;
}
$>> 6
- [=] 表示值传递捕捉所有父作用域变量
int main() {
int x = 5;
int y = 6;
auto f = [=]{
//x,y is read-only
int z;
z = x + y;
std::cout << z << std::endl;
};
f();
return 0;
}
$>> 11
- [&var] 表示以引用传递方式捕捉变量var
int main() {
int x = 5;
auto f = [&x]{
x++;
};
f();
std::cout << x << std::endl;
return 0;
}
$>> 6
- [&] 表示引用传递捕捉所有父作用域变量
int main() {
int x = 5;
int y = 0;
auto f = [&]{
x++;
y++;
};
f();
std::cout << x << std::endl;
std::cout << y << std::endl;
return 0;
}
$>> 6
$>> 1
- [this] 表示值传递方式捕捉当前的this指针
class A {
public:
void foo() {
auto f = [this] {
bar();
};
f();
}
void bar() {
std::cout << "bar" << std::endl;
}
};
int main() {
A a;
a.foo();
return 0;
}
- 参数列表与普通函数的参数列表一致。若不需要传递参数,可省略。
- ->返回类型如果是void时,可以连->一起省略。
int main(int argc, char** argv) {
auto _MAX = [](int x, int y) -> int { return (x > y) ? x : y; };
int a = 3;
int b = 8;
std::cout << _MAX(a, b) << std::endl;
std::cout << [=] { return a + b; }() << std::endl;
auto f = [&](int c) { b = a + c; a = 1; };
f(b);
std::cout << "a: " << a << std::endl;
std::cout << "b: " << b << std::endl;
a = 5; b = 7; //被修改后,重新赋值
auto ff = [=, &b](int c) mutable/*不加会编译报错*/ {b = a + c; a = 1; };
ff(2);
std::cout << "a: " << a << std::endl;
std::cout << "b: " << b << std::endl;
}