C++中lambda表达式(匿名函数)的用法
来源:互联网 发布:淘宝怎么开通直播间 编辑:程序博客网 时间:2024/05/16 14:34
简介
之前在看SICP《计算机程序的构造和解释》一书的时候,中用了大量的Scheme语言(一种Lisp语言的方言)来解释书中的函数式程序设计思想(只读到第二章后半部。。。有空再补)。Scheme的一个主要特性是可以像操作数据一样操作函数调用,
例如实现对一个操作生成的数乘以二的函数:
;这是一个实现对某个值进行乘方的函数(define square (lambda (x) (* x x)));这是我们要实现的函数,其中参数op指的是某个操作(define double_op (lambda (op x) (* 2 (op x))));将square函数作为参数传入double_op函数(display (double_op square 2))
其中函数可以作为参数参与运算,就像C系语言中的数据一样操作。
“函数是一等公民”,这便是函数式编程的信条,C++11中也开始加入了这一思想:lambda表达式;
语法
C++中 lambda表达式的语法形式如下:
[ captures list] ( params ) -> ret { body }
翻译:
[ 捕获列表 ] ( 参数列表 ) ->( 返回值类型){ 函数体 }
其中参数列表和返回类型是可以省略的
示例
不带参数的lambda表达式
auto f = []{return 42;};
这里就定义了一个返回42的函数, f 则是一个可调用函数对象。
带参数的lambda表达式
[](int a, int b){return a > b;};
我们以往调用标准模板库的排序函数的时候通常是这样的:
//先定义一个比较大小的函数bool compare(int a,int b){ return a<b; //升序排列,如果改为return a>b,则为降序}int main(){ int a[20]={2,4,1,73,1,226,0,43,24,6}; //在sort中再调用compare sort(a,a+20,compare); return 0;}
我们用我们的匿名函数的话,就可以这样写:
int main(){ int a[20]={2,4,1,73,1,226,0,43,24,6}; //直接写入lambda表达式 sort(a,a+20,[](int a, int b){return a > b;};); return 0;}
代码简洁性和美观都秒杀前者,嘿嘿。
带值捕获的lambda表达式
有的时候我们在lambda表达式中需要调用外部数据,这时候就可以将值传入值捕获列表中。
例如写一个返回外部变量a的lambda表达式
int a = 3;auto f = [a]{return a;};
注意一点,lambda表达式可以捕获引用。
指定返回类型的lambda表达式
到此为止我们举例的lambda表达式都只有一个return语句,假如有多分支的返回语句,则lambda表达式必须指定类型,例如一个判定是否为正数的匿名函数:
int a = 1; auto f = [](int a)->bool{ if(a > 0) return true; else return false; }; cout << f(a) << endl;
以上为C++11的lambda基本规则,虽然比不上函数式语言的灵活性,但是在编程方法上给人了新的可能,期待以后C++对函数式编程支持的新特性。
- C++中lambda表达式(匿名函数)的用法
- C++11:匿名函数(lambda函数/表达式)及其用法
- 【C#】之匿名函数及Lambda表达式
- C/C++匿名函数(Lambda)表达式
- C#lambda表达式和匿名函数
- C++ 11中关于Lambda表达式(匿名函数)
- Python中匿名函数lambda的各种用法
- 匿名函数 & Lambda 表达式
- 匿名函数 - lambda表达式
- 匿名函数 lambda表达式
- 匿名函数和Lambda表达式的写法
- 匿名函数和lambda表达式
- 委托 匿名函数 ,Lambda表达式
- 4.6 匿名函数:Lambda表达式
- 匿名函数之lambda表达式
- Python 匿名函数 lambda表达式
- [深入学习C#]匿名函数、委托和Lambda表达式
- Python中lambda匿名函数的使用
- 结构体
- VC与DEV编译器关于ifstream的文本反复读取问题存在的不同
- Oracle
- HashSet、TreeSet、LinkedHashSet的区别
- 相关滤波器算法 速度做到极致
- C++中lambda表达式(匿名函数)的用法
- 递归方法
- ZOJ Problem Set
- Linux 文件编程
- qt qml和c++交互的一个简单例子
- CCNP
- 236. Lowest Common Ancestor of a Binary Tree
- Android 7.1 GUI系统-窗口管理WindowManagerService(一)
- CSAPP Note chap3