Lambda表达式时C++11时引入的特性
Lambda又被称作匿名函数,本质是一个特殊的,匿名的类类型。他是一个带有operator()的类,即仿函数。
[capture](params)->ret{body;];
capture:捕获列表
[]:表示不捕获任何变量
[=]:表示按值捕获变量
[&]:表示按引用捕获变量
params:参数表
ret:返回值类型
body:是函数体
class Addnum
{
public:
Addnum(int num):_num(num){}
/*int addnum(int x)const
{
return _num + x;
}*/
int operator()(int x)const
{
return _num + x;
}
private:
int _num;
};
int main()
{
auto num1 = Addnum(10);
auto x = num1(5);
cout << x << endl;
auto add_num2 = [num2 = 10](int x){return num2 + x; };
auto lambda_x = add_num2(5);
cout << lambda_x << endl;
return 0;
}
int main()
{
//末尾直接传参
auto x = [](int x)->int {return ++x; }(5);
cout << x << endl;
[]()->void {cout << "lambda!" << endl; }();
//返回值可以用auto代替 ->可以省略
//std::function<int(int)>func = [](int x)->int {return ++x; };
auto func = [](int x) {return ++x; };
for (int i = 0; i < 10; i++)
{
cout << func(i) << endl;
}
return 0;
}
和for_each()函数的结合使用
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
int multiplier = 2;
vector<int>arr = { 1,3,5,7,9 };
//可以单个取值multiplier 也可以取值全部变量
for_each(arr.begin(), arr.end(), [multiplier](int x) {
cout << x * multiplier << endl;
});
for_each(arr.begin(), arr.end(), [=](int x) {
cout << x * multiplier << endl;
});
//可以单个引用multiplier 也可以引用全部变量
for_each(arr.begin(), arr.end(), [&multiplier](int x) {
multiplier++;
cout << x * multiplier << endl;
});
for_each(arr.begin(), arr.end(), [&](int x) {
multiplier++;
cout << x * multiplier << endl;
});
return 0;
}