编程语言
首页 > 编程语言> > 【C++】 lambda表达式 解析

【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