首页 > 代码库 > C++11之lambda函数
C++11之lambda函数
lambda来源于函数式编程的概念,也是现代语言编程的特点。
首先看看lambda的基本用法:
1 [capture] (params) opt->return {body;}
其中, capture 是捕获列表(即闭包中的自由变量):
- [] 不截取任何变量
- [&] 截取外部作用域中所有变量,并作为引用在函数体中使用
- [=] 截取外部作用域中所有变量,并拷贝一份在函数体中使用
- [=, &foo] 截取外部作用域中所有变量,并拷贝一份在函数体中使用,但是对foo变量使用引用
- [bar] 截取bar变量并且拷贝一份在函数体重使用,同时不截取其他变量
- [x, &y] x按值传递,y按引用传递
- [this] 截取当前类中的this指针。如果已经使用了&或者=就默认添加此选项。
params 是参数表;opt是函数选项;return是返回值类型;body是函数体。
lambda表达式的类型在C++11中被称之为“闭包类型”。我们可以认为它是一个带有operator()的类。因此,可以使用 std::function 和 std::bind 来存储其类型:
1 std::function<int(int)> f1 = [](int i) {return i; }; 2 std::function<int(void)> f2 = std::bind([](int a){ return a; });
1 int a = 0; 2 int b = 1; 3 auto f1 = []{return a; }; //error,没有捕获外部变量 4 auto f2 = [&]{return a++; }; 5 auto f3 = [=]{return a; }; 6 auto f4 = [=]{return a++; }; //error,a是以复制方式捕获的,无法修改 7 auto f5 = [a]{return a + b; }; //error,没有捕获变量b 8 auto f6 = [a, &b]{return a + (b++); }; 9 auto f7 = [=, &b]{return a + (b++); };
举个栗子:
std::vector<int> v = {1, 2, 3, 4}; int sum = 0; for_each(v.begin(), v.end(), [&sum](int value) { sum += value; }); std::cout << "sum:" << sum << endl;
lambda表达式还是比较简单的,理解闭包之后就能轻松地用好lambda啦。
C++11之lambda函数
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。