导航:

导航:

lambda函数介绍和个人理解 (1) 初识lambda

lambda函数介绍和个人理解 (2) lambda与仿函数

lambda函数介绍和个人理解 (3) lambda的语法甜点

什么是lambda函数?

其实,lambda函数我个人更愿意称为lambda运算(lambdacalculus),它是用来表示一种匿名函数。这个严格意义上属于“函数式编程”(Functional Programming)的范畴。当然还是先解释下函数式编程的概念的好。按照当时冯·诺依曼机器的基本计算模型,所谓通过一条条机器指令逐步把输入数据加工成最终的计算结果,而在计算过程中会有大量的内存单元被反复修改。函数式编程的思想就是把所有的这些状态看做一个全集,程序的基本组成部分就是这些状态之间的映射,其实也就是广义上的函数(广义上的函数的概念是,只要存在广义上的集合A,B,并且存在从A映射到B的映射关系,这个映射关系就被称作广义上的函数。在计算机编程领域,广义的函数包含过程,也就是Pascal语言中有名的Procedure)。通过这些函数之间的复杂运算,把输入数据映射到最终结果,这就是函数式编程。回到一开始的lambda运算,lambda运算其实我们就可以理解成一个简单的运算方法,就像加法减法乘法除法一样,就是一个运算规则:

lambda运算 := 传入数据 –>一系列的运算 -> 传出结果

这就是神龙见首不见尾的lambda运算。他其实就是一个运算规则,说的高雅点,叫做lambda算子(lambda operator)。这时候,如果我们结合理解函数式编程的理念,我们就知道为什么这个东西叫lambda函数了,因为满足我上文中所讲到的广义函数的定义啊!广义集合A(传入数据)和广义集合B(传出数据)还有他们的映射关系(一系列的运算),所以其实这个运算就是一个函数。至此,我们终于了解了为什么叫lambda函数。

“匿名的”?匿名的!

可是为什么又要提到,lambda函数是一个匿名函数呢?什么叫“匿名的”函数呢?一般而言,我们都知道,所谓的函数,不论是哪一种编程语言,都要给自定义的函数进行命名处理,看似天经地义。然而只有一种例外,那便是lambda函数。lambda函数没有名字,对的,没有函数名。你可能要问:不对啊?你刚刚不是说,这个lambda函数满足上述的广义函数定义,他不就是一个函数么?

其实这个问题不难解决。没错,他是函数,但没有任何人规定:“一个函数,必须有一个名字与其对应。”你肯定会说,呵呵!你又跟我玩文字游戏。那你解释下lambda函数他究竟是个什么?OK!交给我了:

先给大家看几个典型的lambda函数使用的例子:

/****
    *@PoloShen
    *Title: lambda 02
    */
#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;
int main(){
    []{};                                                //最简lambda函数
    int a = 3, b = 4;
    [=]{return a+b;};                                    //省略参数列表和返回类型
    auto fun1 = [&](int c){b = a + c;};                    //省略了返回类型,无返回值
    auto fun2 = [=, &b](int c)->int{return b += a + c;};//各部分都很完整的lambda函数
    auto fun3 = [a, &b]()->int{return a+b;};            //其他传递方式的例子
    return 0;
}
// 编译选项:: g++ -std=c++11 lambda02.cpp