关于Lambda表达式的研究
关于Lamabda表达式的研究
一、Lamabda的表达式的起源
二、Lamabda表达式的基本原理
三、Lamabda表达式的结构
四、Lamabda表达式的参数说明
五、Lamabda表达式的用法
六、Lamabda表达式的优越性
一、Lamabda表达式的起源
Lamabda表达式的起源来自于仿函数,什么是仿函数呢?简单来说就是一个类长得像函数,比如
Class A;
A();
这就是一个仿函数。
那么仿函数究竟是怎样实现的呢?其实他所使用的就是运算符重载,即为:
Class A
{
Void operator() (int a) {}
Int a;
};
这就是仿函数的用法。
正如前面所述,Lamabda表达式可以看作一个没有类名的表达式,它就是在编译的时候自己启用了一个类名(至于为什么这么做,这个后面谈到优越性的时候会说)。那么当我们明白了这个知识点之后,我们就可以推导出两个结论:1、那就是仿函数可以在一定程度上替代Lamabda表达式。2、其次,Lamaba表达式的很多性质我们可以从仿函数当中是一样的。
二、Lambda表达式的原理
Lambda表达式,它的核心可以理解成一个临时函数,我们可以在其中实现一些内容,里面有返回值等等,也可以保存下来。
三、Lambda表达式的结构
Lambda表达式的结构如下图所示:
[]() mutable exception ->bool {}
其中,红色部分不能省略,而黑色部分是可以省略的。简单解释一下参数。
四、Lambda表达式的参数说明
[]:该参数表达的是传入的内容,即其他的参数可以通过它传入进Lamada函数中。
():Lamada表达式中我们自己设定的参数
Mutable:表示可以修改[]传入的内容
Exception: 我们可以指定是否传送出异常
Bool: 返回值,我们可以传出任何返回值,int都可以。
{}:函数体要实现的内容
五、Lamada表达式的用法
这里要重点说的是这两个[]和mutable,我们在传入参数的时候有两种传法,第一种就是传送value,比如a,第二种传入reference,即&a,那么针对这两种情况和mutable的配合就有四种用法:
Value配合无mutable:那么这种情况是不能修改Value的。这可能也是和仿函数的区别吧。
Value配合mutable:这种情况可以修改Value,但是仅仅限于函数内,如果离开的话是Value的值不会有任何改变的。
Reference配合无mutable:这种情况既可以修改,另外同时外面的Value值也随之改变。
Referenve配合mutable:与第三种情况相同。
接着我列出一段代码:
void test_remove::test3()
{
std::vector<int> vi {5,28,31,46,245,59,24,36};
int x = 30;
int y = 50;
vi.erase(std::remove_if(vi.begin(), vi.end(), [x,y](int n)->bool{
return x<n && n<y;
})
);
for (auto ele : vi) {
std::cout<<"ele is:"<<ele<<std::endl;
}
}
这里我要说明两点,第一,remove_if中的参数自动传入到int n当中去,所以是int,第二,注意没有声明仅仅写函数体的话是不加分号的。
六、Lambda表达式的优越性
最后说一下Lambda表达式的优越性。第一,Lambda表达式可以传入其他参数。第二,因为在函数体中实现的,所以思路比较清晰。
以上就是我对Lambda表达式的研究。