一、什么是Lambda Expression ? 作用是什么?
- Lambda Expression是匿名函数的一种表达方式,就是没有函数名的函数。
- 用途:函数作为参数传递时,可以直接传Lambda Expression,而不用先定义一个函数,再传函数名。
二、语法
[捕获列表](参数列表) -> 返回类型 { 函数体 }
如:[](const string& name) -> void { cout << "My dear " << name << "I love you "<<endl; };
- 参数列表:如果没有参数列表,()可以省略不写。不支持默认参数。
- 返回类型:不写,自动推断。
- 捕获列表:捕获的本质还是参数传递。
// 捕获方式有值捕获和引用捕获两种,值、引用可以混合使用
int i = 10;
int j = 20;
auto f1 = [ =, &i] () { return j + i; }; // 全部值捕获,i引用捕获
auto f2 = [ &, j] () { return i; }; // 全部引用捕获,j值捕获
// 区别:值捕获的变量不能在lambda函数体内修改,引用可以
}
三、示例
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
void show(const int& num)
{
cout<<"My Dear, you're my "<<num<<endl;
}
class c_show
{
public:
void operator()(const int& num)const
{
cout<<"My Dear, you're my "<<num<<endl;
}
};
int main()
{
vector<int> vec={1,2,3,4,5};
for_each(vec.begin(),vec.end(),show); // 普通函数,填函数名
for_each(vec.begin(),vec.end(),c_show()); // 仿函数,填匿名对象
//函数参数是lambda表达式,直接定义一个匿名函数,而非显示定义再传函数名
for_each(vec.begin(),vec.end(),
[](const int& num)
{
cout<<"My Dear, you're my "<<num<<endl;
});
// 或者给lambda函数起名字f
auto f=[](const int& num){ cout<<"My Dear, you're my "<<num<<endl; };
for_each(vec.begin(),vec.end(),f);
// lambda函数可以单独使用
f(88);
}
应用:
**1. 排序遍历等stl算法**
vector<int> v = {1, 2, 3, 4, 5};
sort(v.begin(), v.end(), [](int a, int b) { return a > b; }); // 降序排序
**2. 作为回调函数**
void doSomething(function<void()> func) {
func();
}
doSomething([]() { cout << "Lambda as callback\n"; });
标签:函数,int,捕获,vec,Expression,Lambda
From: https://www.cnblogs.com/albertmak/p/18469546