Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Cpp1-lambda由浅入深学习lambda表达式

Cpp1-lambda由浅入深学习lambda表达式

原创
作者头像
fieldli
修改于 2019-01-23 12:24:07
修改于 2019-01-23 12:24:07
54900
代码可运行
举报
文章被收录于专栏:大块小屋-技术大块小屋-技术
运行总次数:0
代码可运行

首先以一个求圆的面积说起。求圆的面积需要两个参数,PI和半径。

1.普通函数

很容易想到下面的实现方式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 //普通函数实现求圆面积
 double CircleArea(const double& pi,const double& r)
 {
    return r*r*pi;
 }
int main(int argc,char** argv)
{
    double pi = 3.14;
    double r = 2.0;
    cout<<"普通函数:" <<CircleArea(pi,r)<<endl;
}

这种方式实现有啥问题呢?我们要定义一个pi,每次使用这个函数的时候,我都要重新定义一次。而且看起来很丑。当然我们可以直接把pi'定义为一个宏来全局使用。还有其他的方式吗?我们来试一下仿函数的是实现方式:

2.仿函数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//仿函数
class CircleAreaObj
{
public:
    virtual ~CircleAreaObj(){};
    double operator()(double r)
    {
        return r*r*pi;
    };
private:
    double pi=3.14;

};
int main(int argc,char** argv)
{
     //仿函数
    double r = 2.0;
    CircleAreaObj ca;
    cout<< "仿函数:" <<ca(r)<<endl;
}

注意下,这里定义了一个类,并对()进行了重载。在使用的时候,直接用对象名加括号的形式就可以调用了。

这样就把pi这个变量隐藏到类里了。调用的时候不用关注pi这个变量了。通过类的使用变量来存储一些信息,通过重运算符()来达到函数调用的效果。这就是仿函数,本质上就是一个类。

3.lambda表达式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int main(int argc,char** argv)
{
   //lambda
   double pi = 3.14;
    double r = 2.0;
    auto CircleAreaLambda = [pi](double r) -> double{return r*r*pi;};
    cout<< "lambda:" <<CircleAreaLambda(r)<<endl;
}

lambda表达式更简洁,lambda表达式与仿函数的使用效果是一样。lambda表达式原理也是与仿函数一样的。

一线互联网从业人员,欢迎关注公众号:大块小屋。不保证字字珠玑,但能保证每一句话都是经过深入思考。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
C++11 Lambda表达式
C++11新增了很多特性,Lambda表达式(Lambda expression)就是其中之一,很多语言都提供了 Lambda 表达式,如 Python,Java ,C#等。本质上, Lambda 表达式是一个可调用的代码单元[1]^{[1]}[1]。实际上是一个闭包(closure),类似于一个匿名函数,拥有捕获所在作用域中变量的能力,能够将函数做为对象一样使用,通常用来实现回调函数、代理等功能。Lambda表达式是函数式编程的基础,C++11引入了Lambda则弥补了C++在函数式编程方面的空缺。
恋喵大鲤鱼
2019/02/22
1.3K0
C++11——lambda表达式
定义: C++11新增了很多特性,lambda表达式(lambda expression)就是其中之一,很多语言都提供了 lambda 表达式,如 Python,Java ,C#等。本质上, lambda 表达式就是一个可调用的代码单元[1]^{[1]}。实际上是一个闭包(closure),类似于一个匿名的函数,拥有捕获所在作用域中变量的能力;能够将函数做为对象一样使用。通常用用来实现回调函数、代理等功能。lambda表达式是函数式编程的基础,C++11引入了lambda则弥补了C++在函数式编程方面的空缺。
恋喵大鲤鱼
2018/08/03
1.4K0
【C++修炼之路】29.lambda表达式
在C++98中,如果想要对一个数据集合中的元素进行排序,可以使用std::sort方法,如果待排序元素为自定义类型,需要用户定义排序时的比较规则,这个比较规则既可以是我们C语言时的函数指针,也可以是C++中的仿函数,,下面的例子就是利用仿函数的方式。
每天都要进步呀
2023/03/28
3790
【C++修炼之路】29.lambda表达式
编译器如何实现lambda表达式?
lambda表达式在C++11中引入,用lambda表达式表示匿名函数非常方便,语法很简单,而且可以使代码更紧凑,更易于阅读。
fensnote
2021/07/09
7350
【C++】C++11——lambda表达式
为了实现一个比较算法, 都要重新去写一个类,如果每次比较的逻辑不一样,还要去实现多个类,特别是相同类的命名,看代码的人就遭殃了,非常的烦,这些都非常地不方便。所以,C++11中的语法Lambda表达式由此登场。
平凡的人1
2023/10/15
1660
【C++】C++11——lambda表达式
【c++11】lambda表达式
在C++98中,如果想要对一个数据集合中的元素进行排序,可以使用std::sort方法
用户11029103
2025/01/24
810
C++11中lambda表达式与包装器
在C++98中,如果想要对一个数据集合中的元素进行排序,可以使用std::sort方法。
用户11317877
2024/10/31
1030
C++11中lambda表达式与包装器
【C++11特性篇】lambda表达式玩法全解
YY的秘密代码小屋
2024/01/23
2140
【C++11特性篇】lambda表达式玩法全解
C++ lambda表达式
  lambda表达式是C++11引进的一个新特性,其写法比较新颖,经常被一些"老鸟"用到C++的日常开发中,看的"菜鸟"一脸懵逼。
开源519
2022/12/01
8580
【C++11】闭包:仿函数operator() && 绑定器bind && 包装器functino && lambda表达式
​ 闭包有很多种定义, 一种说法是, 闭包是带有上下文的函数。 说白了, 就是有状态的函数,就是有自己的变量。更直接一些, 就是一个类 换了个名字而已。
利刃大大
2025/04/15
890
【C++11】闭包:仿函数operator() && 绑定器bind && 包装器functino && lambda表达式
深入 C++11:移动语义、Lambda表达式与新特性全面解析
成员变量声明时给缺省值是给初始化列表⽤的,如果没有显⽰在初始化列表初始化,就会在初始化列表⽤这个缺省值初始化。(一句话,初始化列表有初始化则初始化,没有初始化用缺省值)
用户11286421
2025/03/23
810
深入 C++11:移动语义、Lambda表达式与新特性全面解析
【python】lambda表达式与排序
其实lambda表达式本质上就是函数体只有一句话的匿名函数, 我们完全可以使用lambda表达式去代替上面那个计算面积的函数,python中的函数是一种对象,如下:
全栈程序员站长
2022/11/19
1K0
【python】lambda表达式与排序
堆结构和lambda表达式的应用(IPO问题)
之前有篇文章讲解了堆结构以及堆排序,堆可以分为大根堆和小根堆,那么我们如何使用么?笔试时需不需要自己重新实现一个堆结构呢?这个问题怎么说,从底层实现是应该会的,也不难,但实际用的时候就不用自己重新造轮子了!C++标准库中有类似堆结构的东西——Priority_Queue!
算法工程师之路
2019/08/05
9890
C++11-lambda表达式/包装器/线程库
捕捉列表,该列表总是出现在lambda函数的开始位置,编译器根据[]来判断接下来的代码是否为lambda函数,捕捉列表能够捕捉上下文中的变量供lambda函数使用
用户9645905
2022/11/30
1.2K0
C++11-lambda表达式/包装器/线程库
[C++11] Lambda 表达式
lambda 表达式(Lambda Expressions)作为一种匿名函数,为开发者提供了简洁、灵活的函数定义方式。相比传统的函数指针和仿函数,lambda 表达式在简化代码结构、提升代码可读性和编程效率方面表现出色。
DevKevin
2024/11/15
1290
[C++11] Lambda 表达式
C++17常用新特性(六)---lambda表达式的扩展
从C++11起就引入了lambda表达式,C++14又对其进行了丰富,开始支持使用泛型lambda。到现在的C++17 lambda的功能又进行了扩展。在C++17新特性中,主要支持了以下两种场景:
CPP开发前沿
2022/04/13
1K0
C++17常用新特性(六)---lambda表达式的扩展
lambda表达式
        一般来说函数是承担着需求实现的重要内聚的组件,而函数内部的回调函数又达到解耦的作用,在对于后期的维护修改和他人的阅读都起到了积极的作用。        
比特大冒险
2023/05/09
2630
lambda表达式
c++11面试宝典(final,delete,deault,explicit,lambda表达式)
持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第4天,点击查看活动详情
雪芙花
2022/10/31
6130
c++11面试宝典(final,delete,deault,explicit,lambda表达式)
C++11新特性--lambda表达式
在C++11以后,形如这样的语法。 [capture](parameters)mutable ->return-type{statment}称为一个lambda表达式,表达一个匿名函数。从编程的角度上看,lambda是一种函数式编程。
lexingsen
2022/02/24
3270
C++11新特性--lambda表达式
【C++11】解锁C++11新纪元:深入探索Lambda表达式的奥秘
前言:在C++编程语言的悠久历史中,每一次标准的更新都带来了革命性的变化,推动了编程范式和性能优化的新边界。C++11标准,作为这一漫长演进过程中的一个重要里程碑,不仅巩固了C++作为高性能系统级编程语言的地位,还引入了众多现代编程特性,极大地丰富了C++的表达力和易用性。其中,lambda表达式和std::function无疑是这些新特性中最引人注目且影响深远的两个
Eternity._
2024/08/05
1350
【C++11】解锁C++11新纪元:深入探索Lambda表达式的奥秘
相关推荐
C++11 Lambda表达式
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验