C++学习笔记(初级篇)——Lambda表达式

Lambda表达式实质上就是一个匿名函数,其语法格式如下:

[变量使用说明符号] (参数列表) -> 返回值的数据类型
{
        //函数体
}

中括号"[]"是Lambda表达式开始的地方,它告诉编译器接下来的代码就是Lambda表达式。

1. [变量使用说明符号]

中括号用来定义Lambda表达式中当前作用域的变量的传递方式,主要有两种形式:

(1). [=] , 表示传值(复制)方式,即Lambda表达式将以只读的方式访问当前作用域中的变量,不允许修改这些变量的值,否则编译器会报错。默认情况下(即中括号留空)也是以传值的方式使用当前作用域的变量。例如:

如下这段代码,通过Lambda表达式来实现统计一个vector容器中所有变量的和的目的,首先采用传值访问即[=]的方式,

#include "stdafx.h"
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
        vector<int> vecInt;
	vecInt.push_back(1);
	vecInt.push_back(2);
	vecInt.push_back(3);
	int nTotal = 0;
	
	for_each(vecInt.begin(), vecInt.end(), [=](int x)
	{
		nTotal += x;
		
	});
	cout << "容器中所有变量的和为:" << nTotal << endl;
        return 0;
}

运行程序,编译器会报如下错误:


果然跟我们前面讲的一样,通过传值访问的方式是无法修改变量的值的,那么我们应该怎么办呢?

(2)这时候就要用传引用的方式来定义Lambda表达式了,即使用"[&]"来代替"[=]",即把上面for_each()那行代码改成如下形式:

for_each(vecInt.begin(), vecInt.end(), [&](int x)
	{
		nTotal += x;
		
	});
然后运行程序,就可以得到正确结果了:


2. 在上面的示例代码中,我们的Lambda表达式没有返回值,故而将其省略了,那如果我的Lambda表达式中有省略值又该怎么写呢?这时候就要用"->"来定义它的返回值类型了,如下例所示:

紧接着前面的代码,加入我还想要统计我的vector容器中偶数的个数,该怎么做呢?很简单,只需要在原来代码上再加上下面的代码就搞定:

int nEven = count_if(vecInt.begin(), vecInt.end(), [=](int x)->bool
	{
		return (x % 2) == 0;

	});
cout << "容器中偶数的个数为: "<<nEven << endl;

运行程序,得到正确结果:


3.Lambda表达式的复用

在实际使用中,经常需要Lambda表达式存储起来以便于应用到多个STL算法中,以实现Lambda表达式的复用,那么具体该怎么做呢?

其实很简单,紧接着刚才的例子,假如我们现在需要将容器中的每个元素都打印输出,为了方便,我定义了一个Lambda函数,当然,由于在实际工作中我经常需要用到这种打印输出的功能,于是乎我何不将它存储起来,以备不时之需,只需要在刚刚代码的后面加上下面这两行代码(不要算上cout那两行哦~)就可以搞定了:

cout << "打印容器中的每一个元素: [ ";
auto display = [](int x)
{
	cout << x << " ";
};
for_each(vecInt.begin(), vecInt.end(), display);
cout << "]" << endl;

然后运行得到输出结果:


上面说得那么多,其实实现起来就一两行代码的事,可见Lambda表达式的简洁性,从此以后只要我想要显示一些int型的变量时,直接用一个display就搞定了,这就实现了代码的复用,真的是方便又装逼~


猜你喜欢

转载自blog.csdn.net/Dr_Neo/article/details/50295485
今日推荐