C++中的lambda表达式,这样学习就对了!
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();
}
运行结果:
能力有限,如有错误,多多指教!原创不易,点赞鼓励一下吧!