2021-6-15 lambda表达式
lambda
参考自:CSDN
lambda 表达式的简单语法如下:[capture] (parameters) -> return type { body },只有 [capture] 捕获列表和 { body } 函数体是必选的,其他可选
int main()
{
/*例一:
* 三部分
* [] : 代表lambda表达式的开始;
* () :入口参数列表
* {} : 代表函数体,函数体里面什么都没有;
* () : 代表函数调用,如果没有这个的话,只代表定义了函数,并没有实际调用函数
*/
[](){}();
/* 也可以是[]{}(); 这种情况是函数没有参数的情况*/
/* 等价表达式:
* void f()
* {
* }
* int main()
* {
* f(); // 没有参数的情况
* }
*/
------------
/* 例二:body部分
* 输出测试
*/
[] { cout << "Hello, World!"<<endl; }();
/* 等价于
* auto lam=[] { cout << "Hello, World!"<<endl; };
* lam();
*/
}
------------
/* 例三:返回值 -> int
* 添加返回值的测试
*/
auto lam =[]() -> int { cout << "Hello, World!"; return 88; };
auto ret = lam();
cout<<ret<<endl; /* 输出88 */
------------
/* 例四:变量捕捉
* 重点学习部分
* [] 不捕获任何变量,这种情况下lambda表达式内部不能访问外部的变量。
* [&] 以引用方式捕获所有变量
* [=] 用值的方式捕获所有变量(可能被编译器优化为const &)
* [=, &foo] 以引用捕获变量foo, 但其余变量都靠值捕获
* [&, foo] 以值捕获foo, 但其余变量都靠引用捕获
* [bar] 以值方式捕获bar; 不捕获其它变量
* [this] 捕获所在类的this指针 (Qt中使用很多,如此lambda可以通过this访问界面控件的数据)
*/
int a=1,b=2,c=3;
auto lam2 = [&,a](){ /* b,c以引用捕获,a以值捕获 */
b=5;c=6; /* a =1; a不能赋值 */
cout << a<<b<<c<<endl; /* 输出 1 5 6 */
};
lam2();
------------
/*例五:lambda在STL中的应用
* 主要使用场景
*/
vector<int> arr = {6,4,3,2,1,5};
static bool compare(int& a,int& b)
{
return a>b;
}
sort(arr.begin(), arr.end(), compare);
or:
sort(arr.begin(),arr.end(),[](int a,int b){return a>b};);
浙公网安备 33010602011771号