lambda
P28 介绍了lambda表达式基本语法
P475 介绍了STL函数对象及Lambda
完整的lambda表达式结构
这里假设我们定义了一个如上图的lambda表达式。现在来介绍途中标有编号的各个部分是什么意思。
- Lambda表达式的引入标志,在‘[]’里面可以填入‘=’或‘&’表示该lambda表达式“捕获”(lambda表达式在一定的scope可以访问的数据)的数据时以什么方式捕获的,‘&’表示一引用的方式;‘=’表明以值传递的方式捕获,除非专门指出。
- Lambda表达式的参数列表
- Mutable 标识
- 异常标识
- 返回值
- “函数”体,也就是lambda表达式需要进行的实际操作
示例
代码:
#include <iostream> using namespace std; int main() { int x = 3, y = 5; auto fun1 = []{ cout << "hello" << endl; }; auto fun2 = [&] { cout << "x:" << x++ << endl; cout << "y:" << y++ << endl; }; auto fun3 = [](int x, int y){return x + y; }; fun1(); fun2(); fun2(); cout<<fun3(6, 8); system("pause"); return 0; }
输出:
解释:
fun1以最简单的lambda表达式,也就是[]{}
fun2指出使用引用的方式传值,x,y在函数使用中改变其值
fun3标明lambda可以拥有参数,指明小括号内
注意:
1. lambda的类型,是个不具名的functiong object,每个lambda表达式的类型都是独一无二的,如果想根据该类型声明对象,可借助于template和auto
2. 使用过程中容易出错的是 auto fun[]{};和fun();
使用
lambda表达式常和STL一起使用
与generate和for_each
#include <iostream> #include <algorithm> #include <ctime> using namespace std; int main() { int a[10] = { 0 }; srand(time(NULL)); generate(a, a + 10, [](){ return rand() % 100; }); cout << "before sort: " << endl; for_each(a, a + 10, [&](int i){ cout << i << " "; }); cout << endl; cout << "After sort" << endl; sort(a, a + 10); for_each(a, a + 10, [&](int i){ cout << i << " "; }); system("pause"); return 0; }