lambda表达式
Lambda表达式是C ++ 11和更高版本中的一个新的语法糖,可以用在调用或作为函数参数传递的位置处定义匿名函数对象。
语法形式
[捕获列表](参数列表)[可变规则][异常说明] -> 返回类型{函数体}; [capture list] [parameters] mutable throw() -> return type { statement };
捕获列表
捕获列表总是出现在lambda函数的开始处,描述了lambda表达式可以访问上下文中的哪些变量
几种形式:
[]
表示不捕获任何变量[var]
按值传递方式捕获变量var[=]
表示按值捕获父作用域的所用变量,包括this[&var]
按引用传递方式捕获变量var[&]
表示按引用捕获父作用域的所用变量,包括this[this]
值传递捕获当前的this[=,&]
值传递与引用传递混合
[=, &a, &b]
表示以引用传递的方式捕捉变量a和b,以值传递方式捕捉其它所有变量[&, a, this]
表示以值传递的方式捕捉变量a和this,引用传递方式捕捉其它所有变量。
注意点
捕捉列表不允许变量重复传递
- [=,a]已经以值传递方式捕捉了所有变量,但是重复捕捉a了,会报错
- [&,&this]&已经以引用传递方式捕捉了所有变量,再捕捉this也是重复
参数列表
与普通函数的参数列表一致,如果不需要参数传递,可以连同()一起省略。
可变规则
按值捕获实际上是lambda拷贝了一个与捕获变量同名的const副本并进行操作,如果需要改变lambda中的值,就需要使用mutable修饰符。
默认情况下lambda函数总是一个const函数,mutable可以取消其常量性,使用该修饰符时,参数列表不可以省略(即使参数为空)。
异常说明
用于抛出异常,不过不建议使用。
返回类型
函数的返回类型,在不需要返回值的时候也可以连同符号->一起省略。
此外,在返回类型明确的情况下,也可以省略该部分,让编译器对返回类型进行推导。
函数体
内容与普通函数一样,不过除了可以使用参数之外,还可以使用所有捕获的变量。
lambda表达式应用
虽然lambda表达式是匿名函数,但是实际上也可以给lambda表达式指定一个名称
auto f = [](int x) { return x%3 == 0;};
lambda在c++ STL中的应用
- for_each
头文件algorithm
遍历执行相应的操作。
#include <iostream> #include <vector> #include <algorithm> using namespace std; int main(){ vector<int> v ; for(int i=0;i<5;i++) v.push_back(i); for_each(v.begin(),v.end(),[](int val){ cout << val << endl; }); return 0; }
- find_if
头文件algorithm
find_if函数带条件的查找元素,可以通过find_if函数来实现查找满足特定条件的元素。
find_if函数依次的遍历容器的元素,返回第一个使函数为true的元素的迭代器,如果查找失败则返回end迭代器。
#include <iostream> #include <vector> #include <algorithm> using namespace std; int main(){ vector<int> v ; for(int i=1;i<5;i++) v.push_back(i); auto ele = find_if(v.begin(),v.end(),[](int val){ return val % 3 == 0; }); cout << *ele << endl; return 0; }
- sort
头文件algorithm
// 递增排序 sort(v.begin(),v.end(),[](int x,int y){ return x<y; }); // 递减排序 sort(v.begin(),v.end(),[](int x,int y){ return x>y; });