C++ 11中匿名函数(lambda表达式)说明及使用场景

1介绍

  1. Lambda表达式的引入标志,在‘[]’里面可以填入‘=’或‘&’表示该lambda表达式“捕获”(lambda表达式在一定的scope可以访问的数据)的数据时以什么方式捕获的,‘&’表示一引用的方式;‘=’表明以值传递的方式捕获,除非专门指出。
  2. Lambda表达式的参数列表
  3. Mutable 标识
  4. 异常标识
  5. 返回值
  6. “函数”体,也就是lambda表达式需要进行的实际操作

Lambda函数可以引用在它之外声明的变量. 这些变量的集合叫做一个闭包. 闭包被定义在Lambda表达式声明中的方括号[]内. 这个机制允许这些变量被按值或按引用捕获.下面这些例子就是:  

[]        //未定义变量.试图在Lambda内使用任何外部变量都是错误的.
[x, &y]   //x 按值捕获, y 按引用捕获.
[&]       //用到的任何外部变量都隐式按引用捕获
[=]       //用到的任何外部变量都隐式按值捕获
[&, x]    //x显式地按值捕获. 其它变量按引用捕获
[=, &z]   //z按引用捕获. 其它变量按值捕获

2使用场景

2.1简化写法

//1.1vector数组求和
int main()
{
	std::vector<int> some_list;
	int total = 0;
	for (int i = 0; i < 5; ++i) some_list.push_back(i);
	std::for_each(begin(some_list), end(some_list), [&total](int x)
	{
		total += x;
	});

	return 0;
}
bool compare(int& a, int& b)
{
	return a > b;
}

//1.2vector数组排序
int main(void)
{
	int data[6] = { 3, 4, 12, 2, 1, 6 };
	vector<int> testdata;
	testdata.insert(testdata.begin(), data, data + 6);

	//sort(testdata.begin(), testdata.end(), compare);
	sort(testdata.begin(), testdata.end(), [](int a, int b) { return a > b; });

	return 0;
}

2.2之前类中开启线程都需要通过静态成员函数,现在通过Lambda表达式,在中括号[this]中可以直接访问到类中的成员变量。

class A
{
public:
	A();
	~A();//析构
private:
	std::unique_ptr<std::thread> monitorThread;
	int a;
};

A::A()
{
	monitorThread = make_unique<thread>([this] {
		while (true)
		{
			cout << "i can access a " << a++ << endl;
			Sleep(100);
		}
	});
}

A::~A()
{

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

苏克贝塔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值