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;
}