C++11 lambda
来源:互联网 发布:路由器无网络怎么回事 编辑:程序博客网 时间:2024/05/17 08:12
参考:http://www.cnblogs.com/haippy/archive/2013/05/31/3111560.html
参考:https://www.zhihu.com/question/20125256
lamdba是C++11的一个新特性,用于使用lamdba表达式构造匿名函数
从一个最基础的小程序开始认识lambda
#include <iostream>using namespace std;int main(){ int x = 5; auto func = [](){cout<<"hello lambda";}; func();}
控制台会打印hello lambda
这个程序里,[](){cout<<"hello lambda";};是一个lambda表达式,auto是C++11的新特性可以用来中自动适配func的类型。
lamdba表达式规范
C++11 的 lambda 表达式规范如下:
[
capture ]
(
params)
mutableexceptionattribute->
ret{
body}
(1) [
capture ]
(
params)
->
ret{
body}
(2) [
capture ]
(
params)
{
body}
(3) [
capture ]
{
body}
(4) 其中
- (1) 是完整的 lambda 表达式形式,
- (2) const 类型的 lambda 表达式,该类型的表达式不能改捕获("capture")列表中的值。
- (3)省略了返回值类型的 lambda 表达式,但是该 lambda 表达式的返回类型可以按照下列规则推演出来:
- 如果 lambda 代码块中包含了 return 语句,则该 lambda 表达式的返回类型由 return 语句的返回类型确定。
- 如果没有 return 语句,则类似 void f(...) 函数。
- 省略了参数列表,类似于无参函数 f()。
mutable 修饰符说明 lambda 表达式体内的代码可以修改被捕获的变量,并且可以访问被捕获对象的 non-const 方法。
exception 说明 lambda 表达式是否抛出异常(noexcept
),以及抛出何种异常,类似于void f()throw(X, Y)。
attribute 用来声明属性。
另外,capture 指定了在可见域范围内 lambda 表达式的代码内可见得外部变量的列表,具体解释如下:
[a,&b]
a变量以值的方式呗捕获,b以引用的方式被捕获。[this]
以值的方式捕获 this 指针。[&]
以引用的方式捕获所有的外部自动变量。[=]
以值的方式捕获所有的外部自动变量。[]
不捕获外部的任何变量。
此外,params 指定 lambda 表达式的参数。
lamdba的用处?
1.令代码更加简洁,lamdba定义匿名函数可以让我们不必再定义一个(污染环境的)函数,尤其如果这个函数只会使用一次的话。
(引用知乎上一段形象的解释:好比电影里面的群众演员,往往他们的戏份很少,最多是衬托主演,跑跑龙套,他们需要名字吗?不需要,因为他们仅仅只是临时出镜,下次可能就用不着了,所以犯不着费心思给他们每个人编个号取个名字,毕竟取个优雅的名字是很费劲的事情)
bool compare(int a,int b){ return a<b;}int main(){ int nums[] = {6,5,8,9,3,2,1}; sort(nums,nums+7,compare); return 0;}
可以简化为
int main(){ int nums[] = {6,5,8,9,3,2,1}; sort(nums,nums+7,[](int a,int b){return a<b;}); return 0;}
2.我们编程时经常使用一些逻辑相同的代码块,我们可以把它总结起来,做成一个函数,这样每次调用的时候就方便了
(可以把七零八散的代码聚集成一坨)
还没想好合适的例子,待补充。。。
- [c#]: Lambda
- C#-Lambda
- c#Lambda
- c#lambda
- C++11 学习笔记 lambda表达式
- 【C++】C++11特性:lambda和function
- C++11 学习笔记 lambda表达式
- C++11 学习笔记 lambda表达式
- 【c/c++】Lambda表达式
- C#--Lambda表达式
- C++ox 之 lambda
- C#:Lambda 表达式
- C++lambda表达式
- C++lambda表达式
- C++lambda详解~读书笔记
- C# Lambda表达式
- C++:lambda表达式
- C++lambda详解~读书笔记
- 取消myeclipse打开后加载maven
- Elasticsearch试水
- Angular开发(二十七)-补充rxjs的使用
- Android 设计模式一:单例模式
- ajax发送请求,以及动态添加到页面
- C++11 lambda
- 基于Gabor滤波器的图像边缘检测实验
- 【算法】程序猿不写代码是不对的70
- 学习笔记——JAVA设计模式<11>享元模式
- 封装:树形节点的封装
- 使用SQL操作SQLite存储的ST_Geometry
- win7 64位安装redis 及Redis Desktop Manager使用
- I/O多路转接之epoll
- Git常见问题汇总