10 | lambda:函数式编程带来了什么?
该思维导图由 AI 生成,仅供参考
C++ 函数的特殊性
- 深入了解
- 翻译
- 解释
- 总结
C++中的lambda表达式为函数式编程带来了革命性的变化。传统的C++函数概念源自C,是面向过程编程的基本部件,但lambda表达式的引入使得函数成为了“一等公民”,可以像变量一样被赋值、限制作用域和生命周期,实现函数的局部化。此外,lambda表达式还具备“闭包”的特性,可以捕获外部变量,在内部代码中直接操作,使得函数式编程与命令式编程在结构上有了很大不同。函数式编程将程序视为由一个个函数组成,函数互相嵌套、组合、调用完成任务,与面向对象编程的实体对象通信完成任务的方式有所不同。lambda表达式的引入为C++带来了全新的编程思维方式,使得编程更加灵活、自由,能够更好地运用标准库里的容器和算法,写出更灵活、紧凑、优雅的代码。lambda表达式的形式简洁,可以在很多地方代替普通函数,甚至可以实现泛型化。然而,滥用lambda表达式可能会导致难以阅读的代码,需要在实践中慢慢积累经验,找到最适合自己的使用方式。
《罗剑锋的 C++ 实战笔记》,新⼈⾸单¥59
全部留言(48)
- 最新
- 精选
- 罗剑锋置顶我在GitHub的lambd.cpp里写了一小段代码,示范了function + lambda实现成员函数的方法,算是对课下作业2的一个参考,同学们可以看看。2020-05-29222
- 冻冻老师,用“map+lambda”的方式来替换难以维护的 if/else/switch,能举个例子吗?
作者回复: 这个需要用到std::function,存储lambda表达式,比如 ~~~ map<int, function<void()>> funcs; funcs[1] = [](){...}; funcs[7] = [](){...}; funcs[42] = [](){...}; return funcs[x](); ~~~ 这样,就把switch/case语句转换成了function+lambda,让map替你自动switch。
2020-05-28664 - 被讨厌的勇气采用lambda表达式替换类的成员函数,成员变量通过 '[this]'可以捕获(相当于成员函数中的this参数),参数、返回值、函数体,lambda表达式都可以实现,所以理论上,是可以替换的。 试了一下,报错:在类内部无法定义auto。之前老师提到过的。
作者回复: 对的,就是这个原因。
2020-05-28223 - xGdllambda由类的operator重载而来,最大的特征是携带私货(闭包),我一般使用闭包最多的就是将任务打包Task推送线程池或下一个流程。这一过程在没有闭包之前,实现起来有些麻烦。
作者回复: 这个就是闭包最常用的场景之一了,把数据和逻辑打包传递。
2020-06-04217 - 海怪哥哥关于lambda对于外部变量的捕获。大家可以这样理解更容易,如果把lambda表达式看成一个常规的变量,那么相同作用域(比如同一个函数)内的变量跟常量对它都是可见的。
作者回复: 这个方法不错,nice。
2020-06-129 - sp0917罗老师, auto pfunc = &my_square; 【1】 auto pfunc = my_square; 【2】 这两种表示有什么区别? 我一直认为函数名和函数指针是对等的,所以我直觉就是使用【2】,但发现这两个在使用pfunc进行操作时效果一样。
作者回复: 是的,一般来说函数名就相当于函数指针,但对于成员函数,就必须要加上&。 所以我习惯上总写&,看起来更清楚,也比较一致。
2020-07-286 - Charles感觉lambda和函数指针的差别好像不是太大,可能是我还没有真正理解吧,我觉得lambda的捕获功能,普通函数也可以用传引用的方式实现?然后将函数打包到别的地方,是不是也可以把普通函数的函数指针打包到别的地方?
作者回复: lambda的一个最核心的特点是变量,是“一等公民”,可以嵌套定义,而函数不能做到,在函数里无法定义函数,所以只能用lambda来就地定义匿名函数。
2020-07-244 - robonix老师,lambda表达式是不是没有常量引用呢?如果怕修改被捕获的变量只能用值传递,那么就有拷贝发生了?
作者回复: 目前的lambda是这样的,不过你可以不在[]里捕获,而是在函数参数里传递常量引用。
2020-06-094 - 张JL我常用lambda替换函数中的小段重复代码。 相同代码重复写几遍感觉很蠢,拿出来做成函数又没有必要,因为没有其他的调用需求,这时候用lambda就简洁多了
作者回复: 对,用lambda来封装小段代码,这就有点函数式编程的意思了。
2020-05-284 - BluebugerMap + lambda是个好东西 想起了以前做 虚拟机时候指令操作码处理时候的一堆case(switch语句)
作者回复: else/switch/case是我个人认为要极力避免的,它增加了代码的复杂度,分支太多导致逻辑不清。
2020-06-253