0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

为什么引入Lambda?C++11 Lambda表达式介绍

冬至子 来源:iDoitnow 作者:艰默 2023-07-18 16:26 次阅读

为什么引入Lambda

Lambda表达式是一个可以内联在我们代码中的函数,我们可以将他传递给另外一个函数。在没有引入Lambda表达式之前,当我们遇到需要对多个数据,按照同一规则进行操作的时候,创建机动函数会更简单,但是必须在其他地方定义好该函数,然后再使用它,有时候两者之间可能距离离的很远,想要了解该函数内部操作的原理,需要翻阅多页源代码找它的定义,这样使得代码的可读性大打折扣。这就是Lambda表达式出现的主要原因。

基本的Lambda语法

lambda表达式是一个匿名函数。其可以捕获作用域中的变量。其在C++11中常用的语法如下:

[captures](params){body}
[captures]{body}  //省略了形参列表,函数不接收实参,如同形参列表为()
[captures](params)- >return-type{body}  //return-type为返回类型


//eg:
//捕获列表     参数列表           函数体
    []   (int a, int b)  { return a < b;}
//捕获列表     参数列表      返回类型          函数体
    []   (double x)  - > double   {int y = x; return x - y;}
/*注:Lambda函数没有声明返回类型,其返回类型相当于使用decltyp根据返回值推断得到的。
     如果函数体内不包含返回语句,则推断出返回类型为void。
     但是仅当函数体完全由一条返回语句组成时,自动类型推断才管用
     否则,需要使用新增的返回类型后置语法*/

:Lambda表达式自动推断返回值类型:有些编译器,像GCC,即使你有多于一个返回语句也不可以自动推断成功,但标准不保证这一点,因此为了防止意外的发生,当函数体内返回语句不止一条的时候,建议使用返回类型后置语法】

其中captures为捕获,它一个包含0个或者多个捕获符的用逗号分隔的列表。params为参数列表,body为函数体。默认的捕获符只有:

  • &:采用引用隐式捕获的方式使用自动变量
  • =:采用复制隐式捕获的方式使用自动变量
    []        // 默认不捕获
    [&]       // 默认以引用捕获(意味着在函数体内可以按照引用的方式使用Lambda表达式所在范围内所有可见的局部变量)
    [&, i]    // 以引用捕获(同上),但i以值捕获
    [=]       // 默认以复制捕获(意味着在函数体内可以按照值传递的方式使用Lambda表达式所在范围内所有可见的局部变量)
    [=, &i]   // 以复制捕获(同上),但 i 以引用捕获
    

下面我们通过C++ Primer Plus中的一个例子进一步理解Lambda表达式:

#include < iostream >
#include < vector >
#include < algorithm >
#include < cmath >
#include < ctime >
const long Size = 390000L;
int main()
{
  using std::cout;
  std::vector< int > numbers(Size);
  std::srand(std::time(0));
  std::generate(numbers.begin(), numbers.end(), std::rand);
  cout < < "Sample size = " < < Size < < 'n';
  // using lambdas
  int count3 = std::count_if(numbers.begin(), numbers.end(),
                             [](int x){return x % 3 == 0;});
  cout < < "Count of numbers divisible by 3: " < < count3 < < 'n';
  int count13 = 0;
  std::for_each(numbers.begin(), numbers.end(),
                [&count13](int x){count13 += x % 13 == 0;});
  cout < < "Count of numbers divisible by 13: " < < count13 < < 'n';
  // using a single lambda
  count3 = count13 = 0;
  std::for_each(numbers.begin(), numbers.end(),
                [&](int x){count3 += x % 3 == 0; count13 += x % 13 == 0;});
  cout < < "Count of numbers divisible by 3: " < < count3 < < 'n';
  cout < < "Count of numbers divisible by 13: " < < count13 < < 'n';
  return 0;
}

程序输出结果:

Sample size = 390000
Count of numbers divisible by 3: 130274
Count of numbers divisible by 13: 30009
Count of numbers divisible by 3: 130274
Count of numbers divisible by 13: 30009

Lambda与STL的结合

当STL中的算法(algorithms)库遇到Lambda的时候,会碰出什么样的火花呢?毋庸置疑,这极大的提高我们的编程效率,更提高了代码的整洁性和可读性,例如:

vector< int > v;
v.push_back(1);
v.push_back(2);
//不使用Lambda表达式
for ( auto itr = v.begin(); itr != v.end(); itr++ )
{
    cout < < *itr;
}

//使用Lambda表达式
for_each( v.begin(), v.end(), [] (int val){cout < < val;} );

正如上面的例子,使用Lambda表达式后,代码显的更漂亮,而且它的可读性也很强,结构更紧凑。

总结

Lambda 引入,使我们在某些情况下,能够将类似于函数的表达式用作接受函数指针或函数符的函数的参数。它更像胶水代码,允许我们将简单的处理逻辑传递到需要的位置,提高开发效率,使得代码结构简洁而且易于理解。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C++语言
    +关注

    关注

    0

    文章

    146

    浏览量

    6878
  • STL算法
    +关注

    关注

    0

    文章

    6

    浏览量

    5338
  • gcc编译器
    +关注

    关注

    0

    文章

    78

    浏览量

    3233
  • Lambda
    +关注

    关注

    0

    文章

    26

    浏览量

    9775
收藏 人收藏

    评论

    相关推荐

    C++的lambda表达式详解

    lambda 表达式就是一个函数(匿名函数),也就是一个没有函数名的函数。为什么不需要函数名呢,因为我们直接(一次性的)用它,嵌入式用的它,不需要其他地方调用它。
    发表于 10-27 10:13 899次阅读

    Java Lambda表达式的新特性

    Java Lambda表达式是Java 8中最重要的新特性之一。 它们是一种可传递的匿名函数,可以作为参数传递给方法或存储在变量中,因此可以在需要的时候调用它们。 基础 1. 简介 Lambda
    的头像 发表于 09-30 10:29 2290次阅读

    C语言:指针表达式

    字符'b' printf("%c\n",*cp);//还是字符'a' return 0;}*(cp+1)在前面的表达式中增加了一个括号。这个括号使表达式先执行加法运算,就是把1和cp中所
    发表于 01-11 13:41

    哪位大神详细介绍委托、匿名方法、Lambda表达式

    委托、匿名方法、Lambda表达式总结
    发表于 11-11 07:50

    表达式求值是什么意思

    嵌入式C语言入门——表达式求值
    发表于 12-15 06:24

    防范表达式的失控

    在C 语言中,表达式是最重要的组成部分之一,几乎所有的代码都由表达式构成。表达式的使用如此广泛,读者也许会产生这样的疑问,像+ 、- 、3 、/ 、& & 这样简单的运算也会出现
    发表于 04-22 16:57 13次下载

    Python正则表达式指南

    本文介绍了Python对于正则表达式的支持,包括正则表达式基础以及Python正则表达式标准库的完整介绍及使用示例。本文的内容不包括如何编写
    发表于 03-26 09:13 10次下载
    Python正则<b class='flag-5'>表达式</b>指南

    Lambda表达式详解

    C++11中的Lambda表达式用于 **定义并创建匿名的函数对象** ,以简化编程工作。下面看一下Lambda表达式的基本构成。
    的头像 发表于 02-09 11:28 849次阅读

    表达式与逻辑门之间的关系

    逻辑表达式是指表示一个表示逻辑运算关系的式子,是一个抽象的类似数学表达式,下面我们重点说明下其表达式与逻辑门之间的关系。
    的头像 发表于 02-15 14:54 1118次阅读
    <b class='flag-5'>表达式</b>与逻辑门之间的关系

    C语言的表达式

    在C语言中,表达式是由操作符和操作数组成。表达式可以由一个或者多个操作数组成,不同的操作符与操作数组成不同的表达式,因此,表达式才是C语言的基本。
    的头像 发表于 02-21 15:09 954次阅读
    C语言的<b class='flag-5'>表达式</b>

    Python中的Lambda表达式

    在 Python 中,Lambda 表达式是一种非常强大的工具,它可以让你快速创建小型匿名函数,而不需要显式地定义函数名称。Lambda 表达式通常用于传递函数对象或简单的函数式编程。
    的头像 发表于 04-19 15:49 521次阅读

    网络工程师学Python-Lambda表达式

    在 Python 中,Lambda 表达式是一种非常强大的工具,它可以让你快速创建小型匿名函数,而不需要显式地定义函数名称。Lambda 表达式通常用于传递函数对象或简单的函数式编程。
    的头像 发表于 04-19 15:51 718次阅读

    如何使用lambda表达式提升开发效率?

    Java8 的一个大亮点是引入 Lambda 表达式,使用它设计的代码会更加简洁。当开发者在编写 Lambda 表达式时,也会随之被编译成一
    发表于 08-24 10:25 172次阅读

    zabbix触发器表达式 基本RS触发器表达式 rs触发器的逻辑表达式

    及时响应异常。其中,触发器是Zabbix中最基本的组件之一,用于检测和处理指标的变化情况。本文将重点介绍Zabbix触发器表达式,以及基于RS逻辑的触发器表达式。 Zabbix触发器表达式
    的头像 发表于 08-24 15:50 1215次阅读

    什么是Lambda函数

    今天来给大家推荐一个 Python 当中超级好用的内置函数,那便是 lambda 方法,本篇教程大致和大家分享 什么是 lambda 函数 lambda 函数过滤列表元素 lambda
    的头像 发表于 10-17 11:27 730次阅读