本文章只提供快速入门教程,旨在帮助新手们(包括我自己)快速入门一个相关知识,不包含详细的知识点以及高级的技术用法。如有需要,可自行查找更加详细的资料。
20分钟入门 - Lambda表达式(C++)
概念
lambda表达式定义了一个匿名函数,可以用来替代普通函数。
作者认为lambda表达式只适用于简单、短小的函数,如果函数逻辑比较复杂,最好还是定义一个函数来实现功能比较好,否则会影响程序的可读性。
表达形式
[ capture ] ( params ) opt -> ret { body; };
其中capture
是捕获列表,params
是输入参数列表,opt
是函数选项,ret
是返回值类型,body
是函数体
详细可以看参考链接2:微软C++语言参考
简单例子
这里我们有一个普通写法的函数:
std::string func_1(int a)
{
return std::to_string(a);
}
它的lambda表达式为:
[](int a) -> std::string { return std::to_string(a); }
这两者是等价的,可以参考下面的例程:
#include <iostream>
#include <string>
std::string func_1(int a);
int main(int argc, char* argv[])
{
auto func_2 = [](int a) -> std::string { return std::to_string(a); };
std::cout << "普通函数输入的是: " << func_1(2) << std::endl;
std::cout << "lambda输入的是: " << func_2(2) << std::endl;
return EXIT_SUCCESS;
}
std::string func_1(int a)
{
return std::to_string(a);
}
其输出结果为:
普通函数输入的是: 2
lambda输入的是: 2
关于捕获列表 capture
捕获列表的类型:
写法 | 含义 |
---|---|
[] | 不捕获任何变量 |
[&] | 按引用 捕获所有变量 |
[=] | 按值 捕获所有变量 |
[=, &a] | 按引用捕获变量a,然后按值捕获其他变量 |
[b] | 只按值捕获变量b,不再捕获其他变量 |
int a = 0, b = 1;
auto f1 = []{ return a; }; // error,没有捕获外部变量
auto f2 = [&]{ return a++; }; // OK,捕获所有外部变量,并对a执行自加运算
auto f3 = [=]{ return a; }; // OK,捕获所有外部变量,并返回a
auto f4 = [=]{ return a++; }; // error,a是以复制方式捕获的,无法修改
auto f5 = [a]{ return a + b; }; // error,没有捕获变量b
auto f6 = [a, &b]{ return a + (b++); }; // OK,捕获a和b的引用,并对b做自加运算
auto f7 = [=, &b]{ return a + (b++); }; // OK,捕获所有外部变量和b的引用,并对b做自加运算