C++中的lambda表达式,这样学习就对了!

零、小序

学习过java、Python等语言的童鞋可能早就知道lambda表达式,C++直到C++11中才引入了lambda表达式,lambda表达式使用方便、代码简洁、定义和使用在同一个地方,而且不需要取名字就可以使用,它本身就是一个匿名的函数。它的好处可以说很多很多,来一起了解一下吧。

一、lambda表达式介绍

1、lambda表达式概念

lambda表达式是C++11中引入的,它是一种匿名函数,通常它作为一个参数传递给接收函数指针或者函数符的函数使用。在C++的STL算法使用过程中,经常可以看到它的身影。

2、lambda表达式的优势

1)遵守就近原则:随时定义随时使用,lambda表达式的定义和使用在同一个地方,并且lambda表达式可以直接在其他函数中定义使用,其他函数没有这个优势。
2)简洁明了:lambda表达式相比较其他函数的更加的简洁明了。
3)效率相对高些:lambda表达式不会阻止编译器的内联,而函数指针则会阻止编译器内联。
4)捕获动态变量:lambda表达式可以捕获它可以访问的作用域内的任何动态变量。

3、lambda表达式基本语法

[capture list] (params list) mutable exception-> return type { function body }
表达式中各个参数的含义如下:
[capture list]:捕获外部变量列表
(params list):形参列表
mutable:表示能不能修改捕获的变量
exception:异常设定
return type:返回类型
function body:函数体
虽然lambda中的参数变量很多,通常情况下并不需要把每一个都使用上,根据自己的需要使用即可,大多数情况下可以直接省略->、mutable、exception,不需要返回类型的话也可以省略return type。一个简单的lambda表达式:[](int x){return x*x;}。

4、lambda表达式捕获外部变量方法

1)参数以值传递方式被捕获:参数以值传递的方式传入到lambda表达式中,值传递方式参数在lambda表达式中值不能被修改。
2)参数引用传递方式被捕获:参数以引用的方式传入到lambda表达式中,引用传递方式参数在lambda表达式内部修改和表达式外部的修改会相互影响。
3)表达式自行推导捕获:当捕获列表[capture list]中不传入任何变量而是写成[=]或者[&],lambda表达式会以值传递[=]或[&]引用传递的方式捕获参数,参数的捕获根据表达式中变量使用情况来推导。

二、lambda表达式代码示例

// TestLambda.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

void myPrintf(int elem)
{
	cout << elem << " ";
}

int main()
{
	cout << "-----------lambda表达式的使用----------" << endl;
	vector<int> tmpVector{};
	tmpVector.resize(10);
	int i = 10;
	int num = 0;
	cout << "-----------使用lambda表达给tmpVector赋值----------" << endl;
	generate(tmpVector.begin(), tmpVector.end(), [i,&num]() {
			num=i*i+num;
		return num;
	});
	cout << "-----------打印i和num的值,以查看值传递和引用传递的区别----------" << endl;
	cout << "i=" << i << "  num=" << num << endl;
	cout << "-----------打印tmpVector中的值----------" << endl;
	for_each(tmpVector.begin(), tmpVector.end(), myPrintf);
	cout << endl;

	cout << "-----------给lambda表达指定一个名字----------" << endl;
	int a = 100;
	auto bFun = [a]()->int {return a / 10; }; // bFun是lambda表达式的名字
	int c = bFun();
	cout << "c=" << c << endl;

	cout << "-----------lambda表达传形参----------" << endl;
	int countIndex = count_if(tmpVector.begin(), tmpVector.end(), 
		[](int x) {
		return x / 1000 == 0; // 找到除以1000等于零的那个数在第几个,注意下标序号从0开始
	});
	cout << "除以1000等于零在vector中的索引为:countIndex=" << countIndex << endl;

	cout << "-----------lambda表达默认捕获外部变量,形参以值传递方式----------" << endl;
	int tmpNum1 = 10;
	int tmpNum2 = 5;
	for_each(tmpVector.begin(), tmpVector.end(), [=](int x) {
		
		x = x * tmpNum1 + tmpNum2;
		cout << "x=" << x << endl;
	});
	for_each(tmpVector.begin(), tmpVector.end(), myPrintf);
	cout << endl;
	cout << "-----------lambda表达默认捕获外部变量,形参以引用传递方式----------" << endl;
	for_each(tmpVector.begin(), tmpVector.end(), [=](int &x) {

		x = x * tmpNum1 + tmpNum2;
		cout << "x=" << x << endl;
	});
	for_each(tmpVector.begin(), tmpVector.end(), myPrintf);
	cout << endl;
    std::cout << "Hello World!\n";
	getchar();
}

运行结果:
在这里插入图片描述

能力有限,如有错误,多多指教!原创不易,点赞鼓励一下吧!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章