【C++】 lambda表达式 解析
作者:互联网
为什么使用lambda表达式:
减少定义函数或类的个数
当能推断出参数类型时,用lambda可以省略参数类型,表达式更加简洁
基本形式:
auto func = []() -> void { cout<<"this is the basic form of lambda!"; };
等号左边: lambda表达式名
等号右边: 中括号 [ ] 里是 写在 此lambda表达式之前 此源文件以内 的所有你需要捕获的变量
小括号 ( ) 里是 此lambda表达式的 输入参数
-> void 是C++11引进的后置数据类型,配合auto食用,指返回void。对于返回类型较长的函数,可以使代码更简洁易读
如果把 func = [ ] 看作一个整体记为FUNC,那么整个表达式有点像函数:
auto FUNC() -> void { cout<<"this is the basic form of lambda!"; }; // 除了最后这个分号 ^_^
ps:
很多时候, lambda 表达式的返回值是非常明显的,这时候允许省略返回值定义:
auto func = [] (){ cout<<"this is the basic form of lambda!"; }; //or auto func = [] { cout<<"this is the basic form of lambda!"; };
进一步:
const int x = 9; void test() { int y = 100; } int main() { int a = 0; int b = 1; int c = 2; //----------------------------------- auto func = [=](int t) -> void { cout<<a+b+c+x+t; }; func(6); } // 输出为18
可见,[=]可以获取不仅main函数里面的一切变量,还能获得main外面的全局变量;
由作用域可知,不可以获得其他函数体内的局部变量。
但是[=]又是什么意思呢?为什么不直接[ ]?
[ ]表示 不捕获外部变量
[=]表示 按值传递的方式捕获 表达式前的所有可捕获的变量
//但是这种捕获方式无法修改捕获的值 int a = 0;
auto func = [=] { ++a; // error };
// 加个 mutable 就可以了 (mutable:不定的) auto func = [=]() mutable { ++a; };
[&]表示 按引用的方式捕获 表达式前的所有可捕获的变量
exp:
[x,&y]表示 我想要捕获的x和y,x默认按值捕获,y按引用捕获
[this] 如果在类内,我们还可以捕获this指针,并且可以用来修改成员;
但是当this指针所指的对象被析构时,这有可能造成指针悬空的问题,理论上用shared_ptr可以解决。
应用场景:
用得比较多的应该是 STL的算法吧,像sort,for_each,transform这些: 比如:vector<int> v; sort(v.begin(), v.end(), [] ( int n1, int n2 ) { return n1 > n2; });
不用lambda的话就得另起几行写个函数再传回来,不是很优雅嗷(虽然c++这个语言本身就不怎么优雅)
标签:int,auto,捕获,C++,void,表达式,lambda 来源: https://www.cnblogs.com/realHarvey/p/16571846.html