C++学习笔记——lambda表达式

如何理解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 有啥用,如果要这样写, 干脆写个一般函数再调用好了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值