C++11新特性:Lambda函数(匿名函数) 一段代码即可理解
基本lambda语法
基本形式如下:
[capture](parameters)->return-type {body}
[]叫做捕获说明符,表示一个lambda表达式的开始。接下来是参数列表,即这个匿名的lambda函数的参数,->return-type表示返回类型,如果没有返回类型,则可以省略这部分。返回类型的表示法,这涉及到c++11的另一特性:自动类型推导,最后就是函数体部分了。匿名函数与普通函数在结构上都是一样,即有传入值,有函数体,唯一就缺函数名而已。
我们可以这样输出"hello,world"
// 定义一个匿名函数,然后用指针指向此函数
auto func = [] () { cout << "hello,world"; };
// 调用函数
func();
关于[] 捕获说明符:
(其实就是如何调用匿名函数所在的函数中的变量)
-
[] 不截取任何变量
-
[&} 截取外部作用域中所有变量,并作为引用在函数体中使用
-
[=] 截取外部作用域中所有变量,并拷贝一份在函数体中使用
-
[=, ¶m] 截取外部作用域中所有变量,并拷贝一份在函数体中使用,但是对param变量使用引用
-
[param] 截取param变量并且拷贝一份在函数体重使用,同时不截取其他变量
-
[this] 截取当前类中的this指针。如果已经使用了&或者=就默认添加此选项。
运行下述代码,即可速度掌握Lambda函数
// C++11新特性:Lambda函数(匿名函数)
#include <iostream>
#include <typeinfo>
using namespace std;
int main(void)
{
// 将创建的匿名函数赋值给sum
auto sum = [](int x, int y) -> int {return x + y; };
// typeid用于返回指针或引用所指对象的实际类型,typeid是操作符,不是函数
// 输出:class <lambda_c2f1f973a39f2b265512c>
std::cout << typeid(sum).name() << std::endl;
int x = 10, y = 20;
auto result = sum(x, y);
// 输出: result:30
std::cout << "result : " << result << std::endl;
// 只是声明了一个lambda函数,但未调用
[] {
std::cout << "Done1" << std::endl;
};
// 声明并调用一个lambda函数
// 输出: Done2
[] {
std::cout << "Done2" << std::endl;
}();
int a = 1, b = 10;
// 无法通过编译
// [] {
// return a + b; // 错误:‘a’未被捕获 错误:‘b’未被捕获
// };
// [=] 通过捕捉,获得上下文的数据,所以可以使用变量a,b,但无法修改a,b
[=] {
return a + b;
};
// 输出:b = 10
std::cout << "b = " << b << std::endl;
// [&] 捕捉上下文,并且可以修改a,b
[&](int c) {
b = a + c;
}(50);
// 输出:b = 51
std::cout << "b = " << b << std::endl;
// [&a, b] (int c) { // a可以在函数体中被修改,而b不能
// b = a + c;
// }(1000);
auto b2 = [a, &b](int c) -> int { // a只读, b读写
b = a + c;
return a + c;
}(1000);
// 输出: b1 = 1001 b2 = 1001
std::cout << "b = " << b << " b2 = " << b2 << std::endl;
int n = getchar();
return 0;
}
运行结果