我是靠谱客的博主 无聊灰狼,这篇文章主要介绍C++ 11中匿名函数(lambda表达式)说明及使用场景,现在分享给大家,希望可以做个参考。

1介绍

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

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

复制代码
1
2
3
4
5
6
7
[]        //未定义变量.试图在Lambda内使用任何外部变量都是错误的. [x, &y]   //x 按值捕获, y 按引用捕获. [&]       //用到的任何外部变量都隐式按引用捕获 [=]       //用到的任何外部变量都隐式按值捕获 [&, x]    //x显式地按值捕获. 其它变量按引用捕获 [=, &z]   //z按引用捕获. 其它变量按值捕获

2使用场景

2.1简化写法

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
//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; }
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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]中可以直接访问到类中的成员变量。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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++内容请搜索靠谱客的其他文章。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部