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};);
posted @ 2021-06-15 11:47  shenlei_blog  阅读(79)  评论(0)    收藏  举报