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. Init Container(初始化容器)

    在很多应用场景中,应用在启动之前都需要进行如下初始化操作. ◎ 等待其他关联组件正确运行(例如数据库或某个后台服务). ◎ 基于环境变量或配置模板生成配置文件. ◎ 从远程数据库获取本地所需配置,或者 ...

  2. Elasticsearch的mapping讲解

    映射是定义文档及其包含的字段的存储和索引方式的过程. 映射定义具有: 元字段 元字段用于自定义如何处理关联的文档元数据.包括文档 _index,_id和 _source领域. 字段或属性 映射包含pr ...

  3. 【C++】从零开始的CS:GO逆向分析1——寻找偏移与基址的方法

    [C++]从零开始的CS:GO逆向分析1--寻找偏移与基址的方法   前言:此文章主要用于提供方法与思路,fps游戏基本都能如此找偏移,文章里找的偏移比较少,主要用来演示寻找思路,文章的后记中会附一个 ...

  4. R语言、02 案例2-1 Pelican商店、《商务与经济统计》案例题

    编程教材 <R语言实战·第2版>Robert I. Kabacoff 课程教材<商务与经济统计·原书第13版> (安德森) P48.案例2-1 Pelican 商店 PS C: ...

  5. 【LeetCode第 313 场周赛】忘光光

    比赛链接 最近不怎么打比赛,不能马上反应过来考察的是什么,全部忘光光了... 6192. 公因子的数目 题意: 给定 \(a\) 和 \(b\),问两者的公因子数量 数据范围:\(1\leq a,b\ ...

  6. Do not use “@ts-ignore” because it alters compilation errors的解决办法

    在@ts-ignore上面添加一行代码: // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore

  7. C++面向对象编程之point-like classes的智能指针和迭代器、function-like classes即仿函数

    1.智能指针 智能指针里面包含其他指针的形式和 委托 感觉比较像; 智能指针一定都需要重载 * 和 -> 操作符 ; 这个符号它作用后还能再继续作用下去; 2.迭代器: 这里主要关注 * 和 - ...

  8. 洛谷P2886 [USACO07NOV]Cow Relays G (矩阵乘法与路径问题)

    本题就是求两点间只经过n条边的最短路径,定义广义的矩阵乘法,就是把普通的矩阵乘法从求和改成了取最小值,把内部相乘改成了相加. 代码包含三个内容:广义矩阵乘法,矩阵快速幂,离散化: 1 #include ...

  9. Java注解(4):一个真实的Elasticsearch案例

    昨天把拼了一半的注解+Elasticsearch积木放下了,因为东西太多了拼不好,还容易乱.休息了一晚上接着来. 接着昨天,创建elasticsearch文档注解(相当于数据表的注解): /** * ...

  10. Linux基础_5_文件管理

    创建 touch 文件名 #创建文件 stat 文件名 #查看文件属性 touch -am 文件名 #更改文件的访问时间及修改时间 删除 rm -rf s/* #递归强制删除s目录下的所有内容(包括文 ...