解决什么问题

对于c++中的lambda表达式,在其它的高级语言中可能没有这个概念,而是用的匿名函数,其实本质上是一个东西。
常用于编写函数,而只调用一次的情况;例如一个按钮点击触发一个函数,只有这一个地方调用;不写又不行,写又很浪费;故引入了匿名函数。

用法格式

1 基本用法
[函数对象参数] (操作符重载函数参数) mutable 或 exception 声明 -> 返回值类型 {函数体}

例如:

int c = [] (int a, int b) -> int {return a+b;
}(1,2);

匿名函数没有名字所以在定义的时候就立马调用
上面代码等价于

int Foo(int a, int b){return a+b;
}int c = Foo(1, 2);

2 改造与auto自动推到结合
将函数体存储起来,用自动推到auto。

//定义
auto f = [](int a, int b){return a+b;
};
//调用
int c = f(1,2);

3 函数式编程
对于表达式lambda作者认为所有的函数都可以用lambda来表示,用一个lambda表达式,他自己在数学上已经证明了,但是这样代码可读性不高。

int c = [] (int n){return [n](int x){return n + x;}(1);
}(2);

说明了lambda可以内部嵌套;程序如果按照这种方式组织就是函数式编程
函数式编程结果至于参数有关,不会被全局变量等影响;特别适合在多线程并发编程中只依赖内部。典型代表就是go语言

auto f = [](int n){return [n](int x){return n + x;};
};
f(1)(2);

4 捕获列表
捕获参数列表可以按照值捕获,引用捕获,或者两者结合。
值捕获在函数内修改后,函数外的不会变化,当有多个匿名函数的时候,每个匿名函数都维护一个自己的值。
例如:

int t = 10;
auto f = [t](){std::cout << t << std::endl;return ++t;std::cout << t << std::endl;
};std::cout << f() << std::endl; // 打印10,11
std::cout << t << std::endl; //打印10

t修改无法修改到外面的。但是如果加上mutable描述符后每个匿名函数只能修改自己的,但是全局的还是不会变动。

        int t = 10;auto f1 = [t]() mutable{std::cout << "f1:t" << t << std::endl;++t;std::cout << "f1:t" << t << std::endl;return t;};auto f2 = [t]() mutable{std::cout << "f2:t" << t << std::endl;++t;std::cout << "f2:t" << t << std::endl;return t;};std::cout << f1() << std::endl; // 10 11std::cout  << f2() << std::endl; // 10 11std::cout  << f1() << std::endl; // 11 12std::cout << f2() << std::endl;  // 11 12std::cout << t <<std::endl;  // 10

捕获的方式:按值捕获,按引用捕获

实际项目中使用

std::vector<int> v = {1,2,3,4,5};
for(int i = 1; i < v.size(); i++){//业务处理
}
等价与
for_each(v.begin(), v.end(), [](int n){//业务处理
});

lambda表达式与匿名函数相关推荐

  1. Python中lambda表达式_匿名函数

    lambda表达式和匿名函数 lambda表达式 ​ lambda表达式可以用来声明匿名函数,实际生成一个函数对象. ​ lambda表达式只允许包含一个表达式,该表达式的计算结果就是函数的返回值. ...

  2. 深入理解Java Lambda表达式,匿名函数,闭包

    前言 对于Lambda表达式一直是知其然不知其所以然,为了搞清楚什么是Lambda表达式,以及Lambda表达式的用法和作用,本文应运而生当做学习笔记分享出来,欢迎指正交流. 什么是Lambda 让我 ...

  3. C++11:Lambda表达式(匿名函数)理解

    C++在C11标准中引入了匿名函数,即没有名字的临时函数,又称之为lambda表达式.lambda表达式 实质上是创建一个匿名函数/对象.即你可以理解为(Lambda 表达式实际上是一个函数,只是它没 ...

  4. lambda表达式或者匿名函数中为什么要求外部变量为final

    1.参考博客 关于Lambda表达式里面修改外部变量问题 JDK8之前,匿名内部类访问的局部变量为什么必须要用final修饰 2.匿名内部类 在jdk7之前,匿名内部类访问外部类的局部变量时,那么这个 ...

  5. 【Python 必会技巧】lambda 表达式(匿名函数)及其在内置函数中的应用

    lambda 表达式,又称匿名函数,即,函数没有具体的名称,常用来表示内部仅包含 1 行表达式的函数. 使用 lambda 编写的代码更加简洁紧凑,但是 lambda 函数支持的功能却是十分有限的,目 ...

  6. 【C/C++学习笔记】C++11 Lambda 表达式 (匿名函数)(TR1)

    Lambda表达式,又称为匿名函数,当我们在函数内部需要嵌套或者调用其他函数时,如果该被调用的函数实现相对简单并且可能在整个项目只使用了一次的时候可以考虑使用匿名函数,这样可以让代码更加紧凑,更加容易 ...

  7. C++11 Lambda表达式(匿名函数)详解

    使用 STL 时,往往会大量用到函数对象,为此要编写很多函数对象类.有的函数对象类只用来定义了一个对象,而且这个对象也只使用了一次,编写这样的函数对象类就有点浪费. 而且,定义函数对象类的地方和使用函 ...

  8. Kotlin学习笔记 第三章 函数 高阶函数 lambda表达式 内联函数

    参考链接 Kotlin官方文档 https://kotlinlang.org/docs/home.html 中文网站 https://www.kotlincn.net/docs/reference/p ...

  9. lambda表达式可以用来声明_lambda表达式可以用来创建包含多个表达式的匿名函数...

    [单选题]下面程序中语句print(i*j)一共执行了____次. for i in range(5): for j in range(2,5): print(i*j) [填空题]_____是目前比较 ...

最新文章

  1. 利用xsl和xml转html没有内容_P系列2代码页转pdf后篇
  2. java数组的几种形式——java编程思想01
  3. mybatis循环map的一些技巧
  4. keras 中 reuse 问题
  5. 详解Nginx Rewrite标记last和break的区别
  6. destoon网站mysql分表_destoon二次开发常用数据库操作_PHP
  7. 23家上市公司抢先机落地区块链应用,政务、金融领域成果最吸睛
  8. 为何vSAN需要至少2n+1台主机,来防止n台主机出现故障(FTT=n)?
  9. 5g通用模组是什么_目前主流的5G模组有哪些?
  10. 聊聊我眼中恺明大神MAE的成功之处
  11. 基于激光诱导石墨烯的柔性传感器最新研究进展[转]
  12. python的IDLE打不开如何解决
  13. 输入电阻、输出电阻、特性阻抗、阻抗匹配
  14. ios 单元测试覆盖率怎么查看_iOS 覆盖率检测原理与增量代码测试覆盖率工具实现...
  15. 分享5个常用的CMD命令。
  16. 揭秘中小企业网络营销迷局与现状
  17. 哪些进销存软件既好用又免费?
  18. unittest测试用例和测试报告
  19. 数学基础:角度,弧度,三角函数
  20. 智慧园区物业可视化大屏

热门文章

  1. 变更git url/添加https.sslverify参数解决同步超时、重置连接错误
  2. python例题——文件独特行数
  3. 中国Java之父张孝祥去世------给it人士的思考
  4. 安装ElasticSearch-Head完毕后,创建索引报错406 Not Acceptable,解决方法
  5. LaTeX-----绘制三线表格
  6. Created with Cocos | 手游《街霸:对决》重磅登场
  7. MongoDB删除表中数据
  8. php datatables,DataTables四种数据源
  9. 珍惜所有的不期而遇,看淡所有的不辞而别
  10. 大数据引发的联想--人工智能