lambda表达式
我们来介绍一下lambda表达式
- lambda表达式可以就地匿名定义目标函数或函数对象,不需要额外写一个函数
- lambda是一个匿名的内联函数
lambda表达式定义了一个匿名函数,语法如下
捕获列表:捕获一定范围内的变量
参数列表:和普通的参数列表一样,没有参数可以省略不写
#include<iostream>
#include<vector>
using namespace std;
//lambda可以就地匿名定义目标函数或函数对象,不需要额外写一个函数
//lambda是一个匿名的内联函数
//[ capture ]( params ) -> ret{body;};
//捕获列表[]:捕获一定范围的变量,参数列表():和普通函数的参数列表一样,如果没有参数参数列表可以不写
//auto fun = [](){} auto fun = []{}
//捕获列表 []不捕获任何变量 [&]捕获外部作用域中所有变量,并且按照引用捕获
//[=]捕获外部作用域的所有变量,按照值捕获,拷贝过来的副本在函数体内是只读的
//[=,&a]按值捕获外部作用域中所有变量,并且按照引用捕获外部变量a
//[b]按值捕获b变量,只读
//[this]捕获当前类中的this指针,让lambda表达式拥有当前类中的this指针,让lambda表达式拥有和当前类成员函数同样的访问权限
class A {
public:
int a = 10;
void output(int x, int y) {
auto f1 = [this] {a++; };
//auto f2 = [this]{return a += x;};//错误 只捕获了当前类中的
auto f3 = [=] {return a + x + y; };
auto f4 = [this, x, y] {return a + x + y; };
}
};
int main() {
int a = 10, b = 20;
//auto f1 = [] {return a; }; 错误 因为没有捕获任何外部变量
auto f2 = [&] {return a++; }; //正确 按照引用捕获外部所有变量
auto f3 = [=] {return a; }; //正确 按照值捕获外部所有变量
//auto f4 = [=] {return a++; };错误 按照值捕获所有外部变量 只读
//auto f5 = [a] {return a + b; };错误 只按照值捕获了a变量
auto f6 = [a, &b] {return a + (b++); };//正确 按照值捕获a 只读a,按照引用捕获b 所以可以修改
auto f7 = [=, &b] {return a + (b++); };//正确 按照值捕获外部所有变量,并且按照引用捕获了b
auto f = [](int i) {return i; };
//auto fun1 = []() {return { 1,2 }; };错误 基于列表初始化需要明确声明函数的返回值类型
auto fun1 = []()-> vector<int> {return { 1,2 }; };
return 0;
}
lambda用法
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
//int main() {
// vector<int> vec = { 1,2,3,4,5,6 };
// sort(vec.begin(), vec.end(), [](int a, int b) { return a > b; });
// for (auto it : vec) {
// cout << it << " ";
// }
//
//}
vector<int> nums;
vector<int> largeNums;
const int ubound = 10;
inline void LargeNumsFunc(int i) {
if (i > ubound) largeNums.push_back(i);
}
void Above() {
//传统的for循环
for (auto it = nums.begin(); it != nums.end(); ++it) {
if (*it >= ubound)
largeNums.push_back(*it);
}
//使用函数指针
for_each(nums.begin(), nums.end(), LargeNumsFunc);
//使用lambda和算法for_each
for_each(nums.begin(), nums.end(), [=](int i) {if (i >= ubound) largeNums.push_back(i); });
}
值得注意的是lambda表达式本身就是一个函数指针,在比较器中可直接写入。