c++11的lambda入门总结

lambda 表达式(又称为 lambda)就像一个匿名函数,保持状态并可访问封闭范围可用的变量。 它是通过定义一个类并构造该类型对象而实现的。

看了一下lambda的教程,现总结一下。

一、lambda表达式


[] 捕获列表,可以捕获值(=)和引用(&),详细看例子介绍。

() 参数列表

{} 函数体


二、lambda表达式可以这么写

[](){};

这段简短的代码是可以编译运行的。[] 捕获列表没有内容,()表示没有参数传递进去。{}表示函数体没有内容。还可以简写如下



[]{};
参数没有内容,可以省略()所表示的参数列表。简写成了这样。下面看具体例子。


三、例子

1、lambda表达的函数体如果想要使用外部的变量,需要在捕获列表中声明一下。

                int i = 10;
 
		[]
		{
			//cout << i << endl;错误例子,不能通过编译。因为i没有写到捕获列表里面去。

		}();

               //正确例子
		int i = 10;
		[i]
		{
			cout << i << endl; //正确,捕获列表已经声明了i,所以函数体可以使用i
		}();

函数体内要使用外部的变量,是需要在捕获列表里面声明的,可以声明为值类型,或者引用类型。这里是值类型。

同时,可以看到,在函数体后面都有一个小括号(),这个小括号,是表示调用了这个lambda表达式。



2、捕获列表可以捕获多个变量。

{
		int x = 10, y = 20, z = 30;
		[x, y, z]
		{
			cout << "x=" << x << ",y=" << y << ",z=" << z << endl;
		}();
	}

捕获列表声明了x,y,z,所以函数体可以使用x,y,z,同时,在函数体后面写上(),调用它,从而能够打印值便于查看。


3、通过“=”号来捕获值

{
		int x = 10, y = 20, z = 30, q = 40, p = 50;
		[=]//捕获列表写成“=”
		{
			cout << "x=" << x << endl;
			cout << "y=" << y << endl;
			cout << "z=" << z << endl;
			cout << "q=" << q << endl;
			cout << "p=" << p << endl;
		}();
	}

有时候,需要传递更多的值进去,就会导致捕获列表变大,可以使用“=”,一次性捕获所有的变量值。在函数体后面写上(),调用它,从而能够打印值便于查看。


4、参数列表的使用

{
		int x = 20;
		char *name = "helloworld";

		[x](char *n)//参数列表(char *n)
		{
			cout << n << endl;
		}(name); //调用的时候需要传递参数。
	}

要使用参数列表,需要在捕获列表后面写明白,例如,要传递一个char *的参数到lambda的函数体里面,需在[x]后面写上(char *n),随后传递参数并调用它,后面的小括号()就不再是空的,而是有参数的(name)。


5、lambda函数体,改变捕获列表的值

	{
		int x = 20;
		[x]
		{
			x++;//错误,因为捕获列表是捕获了值,捕获值是不能修改它的。要捕获引用才能修改值。
			cout << "x=" << x << endl;
		}();
	}

	{
		int x = 20;
		[&]//使用&表明,要捕获外部所有变量的引用
		{
			x++;//正确,此时能修改x的值
			cout << "x=" << x << endl;
		}();
	}

6、通过变量保持lambda表达式的地址。

{
		auto fun = []{cout << "helloworld" << endl; };//此时最后面不必写()。
		fun();//调用lambda
	}
此时,已经不用在函数体后面写上小括号(),因为有了变量保存了lambda的地址,从而通过变量来调用它。



以上是对lambda的人门总结。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值