首页 > 其他分享 ><七>lambda表达式实现原理

<七>lambda表达式实现原理

时间:2022-12-08 21:47:37浏览次数:37  
标签:cout int auto 捕获 v1 原理 表达式 lambda

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;
   }
   })

标签:cout,int,auto,捕获,v1,原理,表达式,lambda
From: https://www.cnblogs.com/erichome/p/16966411.html

相关文章

  • Request_原理和Request_继承体系
    Request_原理:1.request对象和response对象的原理1.request和response对象是由服务器创建的,我们来使用他们2.request对象是来获取请求消息,response对象是来设置响应......
  • 【视频】Copula算法原理和R语言股市收益率相依性可视化分析|附代码数据
    阅读全文:http://tecdat.cn/?p=6193最近我们被客户要求撰写关于Copula的研究报告,包括一些图形和统计输出。copula是将多变量分布函数与其边缘分布函数耦合的函数,通常称为......
  • 【机器学习】回归的原理学习与葡萄酒数据集的最小二乘法线性回归实例
    一,回归1.1回归分析的基本概念回归分析(regressionanalysis)指的是确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法。确定变量之间是否存在相关关系,若存......
  • js 正则表达式
     创建正则两种方式字面量创建正则constr=/test/;对象创建正则letr1=newRegExp("test")调用正则的test方法判断是否符合规则返回true或falseconsole.log(r.test('test')......
  • 跳跃表原理和实现
    跳跃表原理和实现前提有时候会被问到链表如果做到二分搜索,可能会有部分的人会去把链表中的值保存到数组来进行二分,但是如果知道跳跃表的话,那么这个数据结构就可以解决这个困......
  • 正则表达式收藏
    一个好的网站:http://regex-lib.net/Home/有很多正则表达式  匹配中文字符的正则表达式:[/u4e00-/u9fa5]评注:匹配中文还真是个头疼的事,有了这个表达式就好办了 匹配双......
  • HashMap原理
    分享两篇博文:​​http://yikun.github.io/2015/04/01/Java-HashMap%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86%E5%8F%8A%E5%AE%9E%E7%8E%B0/​​......
  • go正则表达式的使用
    正则表达式(或RegEx)是一个特殊的字符序列,它定义了用于匹配特定文本的搜索模式。在Golang中,有一个内置的正则表达式包:regexp包,其中包含所有操作列表,如过滤、修改、替......
  • SpringCloud之RabbitMQ消息队列原理及配置
    本篇章讲解RabbitMQ的用途、原理以及配置,RabbitMQ的安装请查看SpringCloud之RabbitMQ安装一、MQ用途1、同步变异步消息场景:用户下单完成后,发送邮件和短信通知。......
  • 什么叫SSH?原理详解。
    SSH(SecureShell,安全外壳)是一种网络安全协议,通过加密和认证机制实现安全的访问和文件传输等业务。传统远程登录或文件传输方式,例如Telnet、FTP,使用明文传输数据,存在很多的......