ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

【C++】 lambda表达式 解析

2022-08-10 13:52:58  阅读:170  来源: 互联网

标签:int auto 捕获 C++ void 表达式 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有