我是靠谱客的博主 无聊灰狼,最近开发中收集的这篇文章主要介绍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()
{

}

 

最后

以上就是无聊灰狼为你收集整理的C++ 11中匿名函数(lambda表达式)说明及使用场景的全部内容,希望文章能够帮你解决C++ 11中匿名函数(lambda表达式)说明及使用场景所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(34)

评论列表共有 0 条评论

立即
投稿
返回
顶部