对 C++ 中 Lambda Function 的一点感想
来源:互联网 发布:mac 黑苹果安装驱动 编辑:程序博客网 时间:2024/06/12 11:14
最近喜欢上了 C++ 中的 lambda function ,动不动就 for_each 一个 lambda ,或者 find_if 一个lambda 。
lambda function 是在 C++11 标准里的。gcc 要加上 --std=c++0x 参数,MSVC 要求至少 2010 版本。
在此先扯一下 C++ 跟 C 的区别。个人认为主要有4点(从提高编程效率的角度):
- class, OOP
- STL
- template, metaprogramming
- 语法的增强,例如变量定义不用写在函数开头(在 for 循环内也可以定义变量),各种重载,inline,等等。
很多人,说会用 C++,但其实只会1和4而已。这充其量也只能称为 C+ 罢了。还是用 C 的思路,去写 C++ 的代码。
我编程的原则之一,就是要追求代码简洁和效率,能够重用的就尽量重用。而且简洁的代码也提高了可读性。当然,为了执行效率而展开 inline 或者 for 循环之类的除外。
扯远了,言归正传。
lambda function,或者 lambda expression,是属于第4类。它有点类似于function object (当然 C++ 里没有这个东西,借用了 js 的概念) 或者 function pointer。因此它可以跟STL很好地结合起来。
比如 for_each,find_if 这些函数,都需要一个function pointer 作为参数。这是 lambda function 发挥作用的主要地方。
但如果 lambda function 就跟 function pointer 一样,那就没引入的必要了。它的独特之处,就在于可以 capture 局部变量。这就是 C 的 function pointer 望尘莫及之处了。有了这点,lambda function 就是名副其实的 function in function。
举个例子。
比如有一段 switch 代码,有几十种 case 要处理,很多 case 都有一段共同的处理代码(而且写起来还不短)。那段代码还用到了 那个 switch 之前的 N 个局部变量。
用 C 的做法,就是建一个 global function,把那 N 个变量当作参数传进去。为了代码简洁,还可以 #define 一个 macro 来调用那个 function。
但事实上,这段代码,也就这个 switch 里面才会用到。能 local 解决的就不要 global 解决。变量都是用到的时候再定义。(没有人会在 cpp 开头定义几百个 global 变量,然后在 function 里面一个局部变量都不定义吧。)
用 C++ 的做法是,建一个 lambda function 来包含那段共用的代码,同时可以 capture 之前的 局部变量。(少写 N 个参数啊!如果调用 M 次,就少写了 N*M 次)。
把这个lambd function 赋值给一个变量,然后直接把这个变量当作 function 来调用。目前储存 lambda 变量可以用2种 type,一是 function pointer,二是 auto。推荐用 auto,避免了 function pointer 严格的类型限制。
- 对 C++ 中 Lambda Function 的一点感想
- 对国内C语言教材的一点感想(转)
- 对C#的一点感想
- 对XP的一点感想
- 对DP的一点感想
- linux编程中对死锁的一点感想
- 对结对编程的一点感想
- 我对图书策划的一点感想
- 对ASP2.0 SKE的一点感想
- 一点对婚姻和女人的感想
- 对黑链的一点感想
- 对写书的一点感想
- 对写博客的一点感想
- 对NP问题的一点感想
- 谈一点C++的感想
- C++11 std::function用法(对cocos2d-x 3.2 中lambda的部分认识)
- JavaScript开发中规范性的一点感想
- 对CSDN社区一点感想.
- 控件自适应对话框大小
- 关系数据库的特点
- 初习C++点滴摘录之变成的一些规则与建议(7)
- Jeecg - MiniDao专题讲解公开课(2013-08-22 晚8:30-10:30 )
- 类似unix的管道的ruby简单实现代码简单说明
- 对 C++ 中 Lambda Function 的一点感想
- 基于opencv的中值滤波
- Java成为企业应用开发主流的原因?
- Java容器类概述
- windows 7操作系统搭建android开发环境
- c语言中数组,链表的区别
- 抽象类的简单示例
- 第一篇,
- Linux环境安装ACE 6.1.0