lamnda函数--c++11中的匿名函数
来源:互联网 发布:通达信软件怎么用 编辑:程序博客网 时间:2024/06/05 04:38
部分转自https://www.cnblogs.com/pzhfei/archive/2013/01/14/lambda_expression.html
部分转自https://www.cnblogs.com/langzou/p/5962033.html
部分转自http://blog.csdn.net/liqinghua1653/article/details/12308801
C++11提供了对匿名函数的支持,称为Lambda函数(也叫Lambda表达式). Lambda表达式具体形式如下:
[capture](parameters)->return-type{body}
为什么说 lambda 表达式如此激动人心呢?举一个例子。标准 C++ 库中有一个常用算法的库,其中提供了很多算法函数,比如 sort() 和 find()。这些函数通常需要提供一个“谓词函数 predicate function”。所谓谓词函数,就是进行一个操作用的临时函数。比如 find() 需要一个谓词,用于查找元素满足的条件;能够满足谓词函数的元素才会被查找出来。这样的谓词函数,使用临时的匿名函数,既可以减少函数数量,又会让代码变得清晰易读。
比如你代码里有一些小函数,而这些函数一般只被调用一次(比如函数指针),这时你就可以用lambda表达式替代他们,这样代码看起来更简洁些,用起来也方便。
下面举了几个Lambda函数的例子:
[](int x, int y) { return x + y; } // 隐式返回类型[](int& x) { ++x; } // 没有return语句 -> lambda 函数的返回类型是'void'[]() { ++global_x; } // 没有参数,仅访问某个全局变量[]{ ++global_x; } // 与上一个相同,省略了()可以像下面这样显示指定返回类型:
[](int x, int y) -> int { int z = x + y; return z; }在这个例子中创建了一个临时变量z来存储中间值. 和普通函数一样,这个中间值不会保存到下次调用. 什么也不返回的Lambda函数可以省略返回类型, 而不需要使用 -> void 形式.
Lambda函数可以引用在它之外声明的变量. 这些变量的集合叫做一个闭包. 闭包被定义在Lambda表达式声明中的方括号[]内. 这个机制允许这些变量被按值或按引用捕获.下面这些例子就是:
[] //未定义变量.试图在Lambda内使用任何外部变量都是错误的.[x, &y] //x 按值捕获, y 按引用捕获.[&] //用到的任何外部变量都隐式按引用捕获[=] //用到的任何外部变量都隐式按值捕获[&, x] //x显式地按值捕获. 其它变量按引用捕获[=, &z] //z按引用捕获. 其它变量按值捕获
void test() {vector<int> v = { 1,3,5,2,4,6 };std::sort(v.begin(), v.end(), [](int& v1, int& v2)->bool {return v1 < v2; });}
需要访问外部变量时:
void test() {vector<int> v = { 1,3,5,2,4,6 };int compTimes = 0;std::sort(v.begin(), v.end(), [&compTimes](int& v1, int& v2)->bool {compTimes++; return v1 < v2; });}
当我们想引用一个 lambda 表达式时,我们可以使用auto关键字,例如:
auto lambda = [] () -> int { return val * 100; };
- lamnda函数--c++11中的匿名函数
- Objective-C中的闭包性和匿名函数
- C#中的匿名函数
- javascript中的匿名函数
- js中的匿名函数
- javascript中的匿名函数
- js中的匿名函数
- C#中的匿名函数
- js中的匿名函数
- javaScript中的匿名函数
- python中的匿名函数
- JS中的匿名函数
- Java中的匿名函数
- C#-匿名函数
- 【C#】匿名函数使用
- Block剧终:Objective-C中的闭包性和匿名函数
- Block剧终:Objective-C中的闭包性和匿名函数
- Block剧终:Objective-C中的闭包性和匿名函数
- elasticsearch bulk数据--ES批量导入json数据
- Android之NDK与C++的环境变量
- Qt之QSS(动态属性)【转】
- Glide的变换(美图效果)
- 完成FFmepg的移植,编译ffmpeg4Android
- lamnda函数--c++11中的匿名函数
- C++分布式实时应用框架——系统管理模块
- Tomcat 修改/webapps/ROOT发布路径(Linux和windows环境)
- Generate Parentheses
- Java Web项目中解决中文乱码方法总结
- 图论九——最小生成树(prim)
- HorizontalScrollView与Fragment基础使用
- AlertDialog
- 冒泡程序的优化问题