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. CentOS7.9 yum方式安装redis最新版

    yum install -y http://rpms.famillecollet.com/enterprise/remi-release-7.rpm yum --enablerepo=remi ins ...

  2. SQL的事务

    一.基本概念 事务是数据库区别于文件系统的重要特性之一,当有了事务,就可以让数据库始终保持一致性,同时可以通过事务的机制恢复到某个时间点,保证了提交到数据库的修改不会因为系统崩溃而丢失: 事务只是一个 ...

  3. vue 自定义千位符过滤器

    在main.js页面全局引入 Vue.filter('formatNum', function(value) { if(!value) return '' let num = value.toStri ...

  4. css自定义会话框

    效果图图下: HTML代码: <div style="background-color: transparent; border: 1px #DDDDDD solid; width: ...

  5. Codeforces Round #822 (Div. 2) A-F

    比赛链接 A 题解 知识点:贪心. 注意到任意三根木棍的相等最优解是最长减最小,因此从小到大排序,三个三个取,取最小值. 时间复杂度 \(O(n\log n)\) 空间复杂度 \(O(n)\) 代码 ...

  6. POJ2104 K-th number (整体二分)

    刚学了整体二分,用这种解法来解决这道题. 首先对于每个询问时可以二分解决的,这也是可以使用整体二分的前提.将原来的序列看成是插入操作,和询问操作和在一起根据值域进行二分.用树状数组来检验二分值. 1 ...

  7. HDU1712 ACboy needs your help(分组背包)

    每种课程学习不同天数可以获得不同价值,这可以看成一个组,那么题目就是分组背包的模板题了. 1 #include<cstdio> 2 #include<cstring> 3 #i ...

  8. Go中的闭包、递归

    一 闭包详解 闭包的应该都听过,但到底什么是闭包呢? 闭包是由函数及其相关引用环境组合而成的实体(即:闭包=函数+引用环境). "官方"的解释是:所谓"闭包", ...

  9. TomCat之安装

    TomCat 之安装(伪分布式版本) 本次安装是使用的伪分布式的安装(即一台机器安装两个tomcat) 1.通过scp导入tomcat安装包 2.解压缩成俩个文件 3.修改第一个tomcat的配置文件 ...

  10. Java注解(3):一个真实Elasticsearch案例

    学会了技术就要使用,否则很容易忘记,因为自然界压根就不存在什么代码.变量之类的玩意,这都是一些和生活常识格格不入的东西.只能多用多练,形成肌肉记忆才行. 在一次实际的产品开发中,由于业务需求的缘故,需 ...