如何理解C++的lambda表达式
lambda表达式本质上是一种函数,只要掌握了函数的写法,完全不学lambda表达式也没问题。
但是,既然有lambda表达式,就有它存在的道理。与通常定义的函数相比,lambda表达式其实是一种匿名函数,就是lambda定义的函数没有名字。与有名字的函数相比,lambda更简洁,更适合定义一些功能简单、一次调用的函数,可以提高编码效率。另外,就算你打死也不用lambda,至少你需要拥有看懂别人写的lambda的能力吧?
lambda表达式是C++的一种语法糖,是调用的时候才定义的函数,是一种随性的生活状态,是为没有准备也能把握住机会的人而设。
lambda大概长什么样子呢?
const int LOWERLIMIT = 5;
int smallValue;
smallValue = [=](int x, int y)->int {int temp = x < y ? x : y; \
return temp < LOWERLIMIT ? LOWERLIMIT : temp; }(6, 9);
cout << smallValue << endl;
smallValue等号右边的就是一个lambda表达式。
如果用普通函数的写法,应该是这个样子:
const int LOWERLIMIT = 5;
int foo(int x, int y) {
int temp = x < y ? x : y;
return temp < LOWERLIMIT ? LOWERLIMIT : temp;
}
int main(){
int smallValue;
smallValue = foo(6, 9);
cout << smallValue << endl;
}
这个例子中的lambda表达式总共有5部分。
1. [=]
是捕获语句,我认为叫外部访问标识更容易理解,不知为何叫capture。它的作用是告诉函数,你应该如何访问函数体外的变量。比如,该例中使用到了LOWERLIMIT变量。
外部访问标识三种基本表达: []、[=]、[&]
它们的含义分别是什么也不访问、按值访问、按引用访问
按值和按引用访问也可以指定具体的变量名,指定后表示仅可以访问这个变量,不指定则表示可访问全部。如果指明某变量按值访问,直接写上该变量即可,不需添加=号。如有外部变量 u、v、w, [u]表示仅按值访问u, [&u]表示按引用访问u. [u, &v]表示u按值访问,v按引用访问。[=, &w]表示w按引用访问,其它变量全部按值访问。[v, &]表示v按值访问,其余全部按引用访问。
2. (int x, int y)
这一部分是函数的参数, 相法于 foo函数的(int x, int y)。如果没有参数,直接()即可。
3. ->int
这一部分是标明函数返回值类型, 如果返回值是float, 表达式就是->float。如果没有返加值,这一部分可以直接省略。或者如果在函数体中有return 值, 也可以省略这一部分。如例子中去掉 ->int 也没问题。
4. {int temp = x < y ? x : y; \
return temp < LOWERLIMIT ? LOWERLIMIT : temp; }
这一部分就是函数体,相当于foo(int x, int y)中{ }里的内容。
5. (6, 9)
这一部分是对函数的具体调用,相当于foo(6, 9)
事实上,在这个例子中,我们在2和3部分之间还省略了两个东西:
一个是mutable,一个是exception,如throw()
更详细的内容可参考微软文档:Lambda Expressions in C++
除了在lambda表达式上直接调用函数外(如(6,9) ), 也可以先将lambda表达式赋给一个函数变量,然后再调用,如:
auto f1 = [](int x, int y) { return x + y; };
cout << f1(2, 3) << endl;
但不明白auto f1 有啥用,如果要这样写, 干脆写个一般函数再调用好了。