lambda表达式什么?
lambda表达式,也被称为匿名函数,是一种简洁的、灵活的函数表示方法,它基于数学中的λ演算(lambda calculus)得名。在编程中,lambda表达式允许我们定义一个没有名字的函数,并可以将其作为一个参数传递给其他函数,或者赋值给一个变量。
它包含捕获列表、参数列表、表达式和语句,常用于一次性操作或作为函数参数传递。
lambda表达式基本语法如下:
[capture](parameters)->return_type{body_of_lambda}
- capture:捕获列表,用于捕获外部作用域中的变量,使外部作用域的变量在lambda函数体内可见
- capture常见的是默认捕获,即[],表示不指定任何捕获方式,编译器自动捕获;除此之外,[=]表示lambda表达式按值捕获,lambda函数体内不可修改;[&]表示lambda表达式按引用捕获,修改会影响原值;
- parameters:lambda函数的参数列表,类似于普通函数参数列表
- return_type:lambda函数的返回类型,编译器自动推断,可省略
lambda表达式经典案例
1、lambda表达式作为匿名函数传递给变量sum
#include <iostream>
using namespace std;
int main()
{
auto sum=[](int a,int b)->int{
return a+b;
};
int result=sum(6,6);
cout<<"result的输出结果:"<<result<<endl;
return 0;
}
输出结果:
2、lambda表达式作为函数对象传递给STL算数生成算法accumulate(返回函数对象)
#include <iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
std::vector<int> num={0,1,2,3,4,5};
int sum=std::accumulate(num.begin(),num.end(),0,[](int a,int b){
return a+b;
});
cout<<"sum的值:"<<sum<<endl;
return 0;
}
输出结果:
3、lambda表达式与STL标准函数对象一起使用(回调函数)
#include <iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
std::vector<int> num={0,1,2,3,4,5};
for_each(num.begin(),num.end(),[=](int value){
cout<<value<<" ";
});
cout<<endl;
std::sort(num.begin(),num.end(),[](int a,int b){
return a>b;
});
for_each(num.begin(),num.end(),[=](int value){
cout<<value<<" ";
});
cout<<endl;
return 0;
}
输出结果:
4、 lambda表达式捕获变量
#include <iostream>
using namespace std;
int main()
{
int factor=6;
auto multiply=[&factor](int a){
return a*factor;
};
int result=multiply(6);
cout<<"result的输出结果:"<<result<<endl;
return 0;
}
输出结果:
4.1、 lambda表达式捕获变量的进阶(返回函数对象)
高阶函数返回函数对象,在需要创建函数工厂或策略模式时特别好用
#include <iostream>
#include <functional>
using namespace std;
function<void(int)> createMultiplier(int factor){
return [factor](int value){
cout<<"调用函数对象输出结果:"<<value*factor<<endl;
};
}
int main()
{
//创建一个乘以2的函数对象
auto doubleFactor=createMultiplier(2);
//调用函数对象
doubleFactor(6);
return 0;
}
输出结果:
5、 lambda表达式作为构造自定义函数对象
lambda表达式作为构造自定义函数对象因其复杂度高,且c++11之后版本做了改进,不需要显式地创建自定义对象,有点鸡肋,了解。
#include <functional>
using namespace std;
struct MyFunctionObject{
MyFunctionObject(const function<void(int)>& func):func_(func){}
void operator()(int value) const{
func_(value);
}
private:
function<void(int)> func_;
};
int main()
{
//使用lambda表达式初始化自定义函数对象
MyFunctionObject myFuncObj([](int number){
cout<<"我被调用:"<<number<<endl;
});
//传参调用自定义函数对象
myFuncObj(666);
return 0;
}
输出结果:
其他
accumulate算法
accumulate算法用来计算容器元素的累计总和
accumulate表达式如下:
accumulate(iterator begin,iterator end,value)
accumulate(iterator begin,iterator end,value,二元操作函数或函数对象)
- iterator begin:输入迭代器的起始位置(first)
- iterator end:输入迭代器的结束位置(last)
- value:累积初始值
- 二元操作函数或函数对象:accumulate函数接受第四个参数用于定义如何累积元素
[=]、[&]的混合应用
#include <iostream>
using namespace std;
int main()
{
string x="你好,C++";
int y=11;
cout<<x<<y<<endl;
auto lambda=[x,&y](){
y=24;
cout<<x<<y<<endl;
};
//调用lambda表达式
lambda();
return 0;
}
输出结果:
tips
需要注意的是lambda表达式的return_type如果没有省略,表达式前面也可以不加指向运算符->;
λ演算是一种用于研究函数定义、函数应用和递归的形式系统。λ演算中的基本元素是lambda抽象(lambda abstraction),它允许你定义一个匿名函数,即没有名字的函数;
高阶函数:在c++中通常指接受函数对象(包括lambda表达式)作为参数,或者返回函数对象的函数。