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做自加运算

参考链接

  1. C语言中文网:http://c.biancheng.net/view/3741.html
  2. 微软C++语言参考:https://docs.microsoft.com/zh-cn/cpp/cpp/lambda-expressions-in-cpp?view=vs-2019
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值