C++11 函数对象的升级版=>lambda表达式

函数对象的缺点:

使用在泛型算法,参数传递, 比较性质/自定义操作 优先级队列, 需要专门定义出一个类

//lambda表达式语法:
//[捕获外部变量](形参列表)->返回值{操作代码} auto func1=[]()->void{cout<<"hello world"<<endl;}
func1(); //编译器根据 []()->void{cout<<"hello world"<<endl;} 产生一个函数对象

上面等价于

template<typename T=void>
class TestLamda{ public:
TestLamda(){}
void operator(){
cout<<"hello world"<<endl;
}
} TestLamda<> t1;
t1();
[]()->void{cout<<"hello world"<<endl;}
[] 相当于 TestLamda(){}
() 相当于 operator()
void 相当于 void operator() {cout<<"hello world"<<endl;} 相当于
void operator(){
cout<<"hello world"<<endl;
}

示例2

auto f2=[](int a,int b)->int {int c=a+b;cout<<c<<endl; return c;}

相当于
template<typename T=int>
class TestLamda{ public:
TestLamda(){}
int operator(int a, int b){
int c= a+b;
cout<<c<<endl;
return c;
}
}

如果lambda表达式没有返回值那么 "->返回值" 可以不要 优化如下

auto f2=[](int a,int b){int c=a+b;cout<<c<<endl; return c;}

关于 [捕获外部变量]
[]表示不捕获任何变量
[=] 以传值得方式捕获外部的所有变量
[&] 以传引用的方式捕获外部所有变量
[this] 捕获外部的this指针
[=,&a] 以传值的方式捕获外部的所有变量,但是a变量以传引用的方式捕获
[a,b] 以值传递的方式捕获外部a 和 b
[a,&b] 以值传递的方式捕获a, b以引用的方式传递 int a=10;
int b=20;
auto function=[&a,&b](){int temp=a;a=b;b=temp;} //实现a,b交换, 一定要 [&a,&b] 引用 或者
auto function=[&](){int temp=a;a=b;b=temp;}// 表示定义的外部变量全部以引用的方式 传入,来捕获.

lambda 简单应用

vector<int> v1;

//排序
sort(v1.begin(),v1.end(),[](int a, int b)->bool{return a>b;}) //找到 第一个小于65的 值
auto it_find=find_if(v1.begin(),v1.end(),[](int a)->bool{return a<65;}) //打印元素
for_each( ;v1.begin()!=v1.end() ; [](int a){cout<<a<<endl;}) //打印偶数
for_each( ;v1.begin()!=v1.end() ; [](int a){
if(a%2==0){
cout<<a<<endl;
}
})

<七>lambda表达式实现原理的更多相关文章

  1. Lambda表达式运行原理

    目录 一.创建测试样例 二.利用Java命令编译分析 三.文末 JDK8引入了Lambda表达式以后,对我们写代码提供了很大的便利,那么Lambda表达式是如何运用简单表示来达到运行效果的呢?今天,我 ...

  2. 深入探究JVM之方法调用及Lambda表达式实现原理

    @ 目录 前言 正文 解析 分派 静态分派 动态分派 单分派和多分派 动态分派的实现 Lambda表达式的实现原理 MethodHandle 总结 前言 在最开始讲解JVM内存结构的时候有简单分析过方 ...

  3. Util应用程序框架公共操作类(七):Lambda表达式公共操作类

    前一篇扩展了两个常用验证方法,本文将封装两个Lambda表达式操作,用来为下一篇的查询扩展服务. Lambda表达式是一种简洁的匿名函数语法,可以用它将方法作为委托参数传递.在Linq中,大量使用La ...

  4. Java Lambda表达式初探

    Java Lambda表达式初探 前言 本文受启发于Trisha Gee在JavaOne 2016的主题演讲Refactoring to Java 8. Java 8已经发行两年多,但很多人仍然在使用 ...

  5. python之lambda表达式

    lambda函数小结 1.lambda表达式: 以前看人家写一个长式子就能干一件我写一个函数干的事情觉得好帅,现在通过学习知道了lambda表达式其原理就是一个函数,而且是一个只能处理简单功能的函数. ...

  6. Java :一文掌握 Lambda 表达式

    本文将介绍 Java 8 新增的 Lambda 表达式,包括 Lambda 表达式的常见用法以及方法引用的用法,并对 Lambda 表达式的原理进行分析,最后对 Lambda 表达式的优缺点进行一个总 ...

  7. 一文掌握 Lambda 表达式

    本文将介绍 Java 8 新增的 Lambda 表达式,包括 Lambda 表达式的常见用法以及方法引用的用法,并对 Lambda 表达式的原理进行分析,最后对 Lambda 表达式的优缺点进行一个总 ...

  8. Java 8:掌握 Lambda 表达式

    本文将介绍 Java 8 新增的 Lambda 表达式,包括 Lambda 表达式的常见用法以及方法引用的用法,并对 Lambda 表达式的原理进行分析,最后对 Lambda 表达式的优缺点进行一个总 ...

  9. Java基础进阶:内部类lambda重点摘要,详细讲解成员内部类,局部内部类,匿名内部类,Lambda表达式,Lambda表达式和匿名内部类的区别,附重难点,代码实现源码,课堂笔记,课后扩展及答案

    内部类lambda重点摘要 内部类特点: 内部类可以直接访问外部类,包括私有 外部类访问内部类必须创建对象 创建内部对象格式: 外部类.内部类 对象名=new外部类().new内部类(); 静态内部类 ...

  10. 17.继承 and18.接口和多态 内部类 匿名内部类,Lambda表达式

    1. 继承 1.1 继承的实现(掌握) 继承的概念 继承是面向对象三大特征之一,可以使得子类具有父类的属性和方法,还可以在子类中重新定义,以及追加属性和方法 实现继承的格式 继承通过extends实现 ...

随机推荐

  1. k8s更换网络插件:从flannel更换成calico

    卸载flannel 查看已安装的flannel的信息 # 查看CNI插件,可以得知使用的是flannel # cat /etc/cni/net.d/10-flannel.conflist { &quo ...

  2. NSIS 检测默认浏览器

    #检测默认浏览器 #编写:水晶石 #原理:用FindExecutable函数查找htm关联程序路径与名称,然后分析字串中包含的可执行文件名. !include "LogicLib.nsh&q ...

  3. InnoDB关于事务、锁、MVCC专题

    目录 并发所带来的的问题 脏写 脏读 不可重复读 幻读 事务 事务的特性 事务的四种隔离级别 锁 为什么要加锁 InnoDB的七种锁 不同事务RR和RC下加锁的规则 MVCC mvcc进一步提高并发 ...

  4. MatrixOne从入门到实践03——部署MatrixOne

    MatrixOne从入门到实践--部署MatrixOne 前两章节我们简单介绍了MatrixOne和源码编译了MatrixOne.本章节将使用不同的部署方式,来部署MatrixOne的服务. 注意:不 ...

  5. 运行eeui项目不出现 WiFI真机同步 IP地址

    从git上 clone项目之后,安装依赖  npm install eeui环境配置    npm install eeui-cli -g 问题:npm run dev  后项目一直不出现 WiFI真 ...

  6. 创建SpringMVC工程

    引入依赖 <dependencies> <!-- SpringMVC --> <dependency> <groupId>org.springframe ...

  7. Double数据运算过程中精度调整

    Double数据进行运算时,容易出现多位小数的精度问题 ①问题现象 ②解决方案 使用BigDecimal类型来进行Double类型数据运算 创建BigDecimal类型对象时将Double类型的数据转 ...

  8. Docker | redis安装及测试

    此篇文章目的是熟悉一下redis的下载安装使用,为后面部署redis集群做准备. 下载安装 linux上,我在/download目录下,执行下载的命令 root@--- ~]# wget http:/ ...

  9. 【听如子说】-python模块系列-AIS编解码Pyais

    Pyais Module Introduce pyais一个简单实用的ais编解码模块 工作中需要和ais打交道,在摸鱼的过程中发现了一个牛逼的模块,对ais编解码感兴趣的可以拿项目学习一下,或者运用 ...

  10. C语言客房管理&酒店管理

    #include<iostream> #include<string.h> #include<stdlib.h> #include<iomanip> # ...