文章目录
前言
本文介绍C++11新特性中的lamdba
在C++11中支持了lambda表达式,如果你想生成一个简短、方便调用、函数内部清晰的轻量级函数,
lambda是一个不错的选择。它允许我们在函数中生成函数,也可以向对待函数一样对待lambda。
lambda
- 首先看使用,对比跟普通函数声明的区别,lambda函数多了几部分
尽管lambda通常使用在函数内部,但它也能在全局范围内声明
// 使用
int lm_greater = [](int x,int y){
return x>y?x:y;
};
- 定义
lambda函数通常由这几部分组成
[]方括号
中填捕获值,()圆括号
中填参数,{}花括号
为函数体。
// 定义
[](){return ;};
/** 如果不想要返回值,或者显式指定返回值类型: */
auto lm = [](...) -> void{...};
auto lm = [](...) -> int{return (int);};
- 捕获
方括号[]内代表捕获内容,这是跟普通函数样子上的主要区别 。
关于[]内的值:
[&]
代表捕获所有有效作用域内值的引用,即可以修改捕获到的值;
[=]
代表捕获所有有效作用域内值的复制,就是复制一份在lambda函数体内使用,但不影响函数体外;
[&N,=]
代表捕获N的引用,并捕获其他所有值的复制;
[=N,&]
代表复制一份N,并捕获其他所有值的引用;
复制和引用跟圆括号()
中的使用是类似的,具体怎么选择还需要在实践中体验!
如果不清楚什么是复制、什么是引用,这里简单陈述一下:引用即取地址符&
,填写进来的形参在函数体内被修改会影响函数体外的实参;若不使用取地址符&
,传进来的参数其实会被复制一份当作形参使用,被视为复制
,这也是为什么函数内形参的修改,不会改变体外参数值的原因。
// 捕获
main:
int x,y;
void lm = [&](){ x=10; y=20; }; *这个lambda函数将要修改x,y的值(前提是在有效作用域内声明了x,y)
lm();
进阶用法
- 一般地,在使用
sort()
函数,sort()函数基本用法:void sort(it.begin(),it.end(),function)
其中第三个参数是可选项,这表示默认情况下如果对一个整数数组使用sort()后,数组会变为升序,而若启用第三个参数,可以自定义排序规则,比如使用lambda:
#include<vector>
vector<int> v = {2,5,3,1};
sort(v.begin(),v.end(),[](int x,int y){return x>y;}); //数组会变为降序
而无论是lambda
还是普通函数,都可以用C++标准库中std::function<void(int)>
模版来表示。
定义scan()
函数,接收一个数组、长度及一个函数,scan()
函数会对arr数组中的每个元素执行funs()
函数。
void scan(int arr[],int len,function<void(int)> funs){
for(int i=0;i<len;i++)
funs(arr[i]);
}
这样就允许我们对同个或多个数组更简洁的执行不同操作,当然一般是些简单的操作,比如数组求和,打印数组元素,查找某个元素等
。例如:
* main:
// 求和
int sum=0;
scan(arr,len,[&sum](int x){sum+=x;});
// 打印
scan(arr,len,[](int x){cout<<x<<" ";});
// 查找
int key;
scan(arr,len,[](int x){if(x==key) cout<<"key exist"});
总结
- 以上就是常用的lambda用法,学会使用lambda,能让代码更简洁、提高代码可读性。作为C++11中的新特性,强烈建议大家学起来~
如有疏漏错误,还望补充纠正,感激不尽!
标签:11,函数,int,捕获,C++,复制,数组,lambda From: https://blog.csdn.net/2301_76622358/article/details/143771566