C++ :Lambda函数的浅学习

这篇具有很好参考价值的文章主要介绍了C++ :Lambda函数的浅学习。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

文章目录

  • 前言
  • 一、lambda函数实例
  • 总结

前言

lambda表达式又被称之为lambda函数,是c++11的新特性,下面我们看一下lambda表达式的参数等说明:

[函数对象参数](操作符重载函数参数)mutable或exception声明->返回值类型{

函数体

}

下面我们说明一下参数类型以及变量截取规则:

1.[函数对象参数]:捕捉列表。捕捉列表总是出现在lambda函数的开始处,[]是lambda函数的引出符,这个必须存在不可以省略。编译器会根据引出符判断接下来的代码是否是Lambda函数。捕捉列表能够捕捉上下文中的变量以供Lambda函数使用。

2.函数对象参数形式列表:

空。没有任何函数对象参数。

=。函数体内可以使用 Lambda 所在范围内所有可见的局部变量(包括Lambda所在类的this),并且是值传递方式(相当于编译器自动为我们按值传递了所有局部变量)。

&。函数体内可以使用 Lambda 所在范围内所有可见的局部变量(包括 Lambda 所在类的 this),并且是引用传递方式相当于是编译器自动为我们按引用传递了所有局部变量)。

this。函数体内可以使用 Lambda 所在类中的成员变量。

a。将 a 按值进行传递。按值进行传递时,函数体内不能修改传递进来的 a 的拷贝,因为默认情况下函数是 const 的,要修改传递进来的拷贝,可以添加 mutable 修饰符。

&a。将 a 按引用进行传递。
a,&b。将 a 按值传递,b 按引用进行传递。

=,&a,&b。除 a 和 b 按引用进行传递外,其他参数都按值进行传递。
&,a,b。除 a 和 b 按值进行传递外,其他参数都按引用进行传递

3.[操作符重载函数参数] : 标识重载的 () 操作符的参数,没有参数时,这部分可以省略,可以连同括号“()”一起省略。

参数可以通过按值(如: (a, b))和按引用 (如: (&a, &b)) 两种方式进行传递。

4.mutable 或 exception 声明 :mutable 可变变量,exception 异常

注:在使用该修饰符时,参数列表不可省略(即使参数为空);

5.[返回值类型] :返回类型,当不需要返回类型时(void),可以省略

6.[函数体] : 函数内容,可以使用上下文的数据。


一、lambda函数实例

#include <iostream>
using namespace std;
int main()
{
    auto func = [](){cout<<"hello Lambda"; };
    func();
}

 C++ :Lambda函数的浅学习

 在上图中func就是一个lambda函数,我们使用auto来自动获取func的类型,这一步非常重要,当我们定义好lambda函数之后,就可以当正常函数来使用了。[]表示接下来定义lambda函数,正常情况下只要函数体所有return都是同一个类型的话,编译器就会自行判断函数的返回类型,也可以显式的指定lambda函数的返回类型,这就需要用到函数返回值后置的功能,比如下面这个代码:

[]()->int{return 1;}

 那么lambda函数有什么用呢?假如我们设计的一个类需要提供函数查询这个类,可能会根据多种情况查询,还有可能两者结合,我们如果为每个情况都写个函数,那么一定显得很冗余,这个时候就可以用lambda函数来实现这个功能,只需要提供一个接口让用户方便的自定义自己的查询方式。

Lambda函数和STL有什么关系呢?lambda函数的引入为STL的使用提供了极大的方便,就比如下面这个例子,以前我们想遍历一个vector的时候是下面这样的:

int main()
{
    vector<int> v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);
    v.push_back(4);
    v.push_back(5);
    vector<int>::iterator it = v.begin();
    for(auto ptr = it;ptr!=v.end();ptr++)
    {
      cout<<*ptr;
    }
}

当我们用lambda后变成了这样:

int main()
{
    vector<int> v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);
    v.push_back(4);
    v.push_back(5);
   for_each(v.begin(),v.end(),[](int val)
   {
           cout<<val;
   } );
}

 我们用lambda表达式这样的写法可以提高代码的执行效率,因为编译器有可能使用"循环展开"来加速执行过程。


总结

lambda 表达式就是一个函数(匿名函数),也就是一个没有函数名的函数。为什么不需要函数名呢,因为我们直接(一次性的)用它,嵌入式用的它,不需要其他地方调用它。lambda表达式也叫闭包。闭就是封闭的意思(封闭就是其他地方都不调用它),包就是函数。lambda表达式其实就是一个函数对象,他内部创建了一个重载()操作符的类。lambda的引入给我们带来了一种全新的编程体验,使我们从繁琐的语法中解放出来,更加关注于 “算法” 本身。文章来源地址https://www.toymoban.com/news/detail-423471.html

到了这里,关于C++ :Lambda函数的浅学习的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++ lambda表达式函数递归调用简单写法实现

    在C++11中,lambda表达式函数递归往往会带上 functional 头文件。书写形式如下: 还有相对简单点的第二种写法(C++14): 对于第二种, auto fib 的作用是为了在 lambda 表达式内部能够递归调用自身。在 C++14 中,lambda 表达式默认是无法直接递归调用的,因为在 lambda 内部无法访问到

    2024年02月15日
    浏览(36)
  • C++结合Lambda表达式在函数内部实现递归

    529. 扫雷游戏 已解答 中等 相关标签 相关企业 让我们一起来玩扫雷游戏! 给你一个大小为  m x n  二维字符矩阵  board  ,表示扫雷游戏的盘面,其中: \\\'M\\\'  代表一个  未挖出的  地雷, \\\'E\\\'  代表一个  未挖出的  空方块, \\\'B\\\'   代表没有相邻(上,下,左,右,和所有4个

    2024年02月21日
    浏览(30)
  • 【C++】c++11新特性(二)--Lambda函数及function(包装器)

    目录 Lambda函数 基本概念 基本语法 lambda 捕获(capture) 1. 不捕获任何变量 2. 按值捕获 3. 按引用捕获 4. 混合捕获 5. 捕获this 指针 包装器 function 基本概念 使用场景 1. 给function对象赋值  2. 作为函数参数和返回值   3. 存储在容器中 4. 绑定成员函数和带参数的函数        la

    2024年04月27日
    浏览(30)
  • kotlin学习(二)泛型、函数、lambda、扩展、运算符重载

    Kotlin 中的类可以有类型参数,与 Java 类似: 创建这样类的实例只需要提供类型参数即可: 如果类型参数可以推断出来,例如从构造函数的参数或者从其他途径,就可以省略类型参数: String作为Object的子类,就可以直接将子类对象赋值给父类,这个操作即达到了 型变 。 但是

    2024年02月09日
    浏览(29)
  • C++系列十:日常学习-Lambda表达式

    目录 前言 必备理论知识: 例子: 20230920 加 例如 对函数指针和指针函数补充: 有C#经验,使用起来,驾轻就熟。 就是语法糖。但是也要熟悉用法,才好众享丝滑。 内容参考: Chatjpt、文心一言 C++ lambda 表达式是一种功能强大的编程工具,它允许您在代码中创建匿名函数或闭

    2024年02月08日
    浏览(41)
  • 【C++】C++11右值引用|新增默认成员函数|可变参数模版|lambda表达式

    在C++11之前,我们只有引用的概念,没有接触到所谓的左值引用或者是右值引用这种概念,从C++11开始,增加了右值引用的概念,那么现在我们将对引用进行一个概念上的区分。在此之前我们所说的引用都是左值引用,对于左值引用相关的内容,可以去看一看博主之前写的文章

    2024年02月15日
    浏览(43)
  • 面试之快速学习c++11- 列表初始化和 lambda匿名函数的定义

    学习地址: http://c.biancheng.net/view/3730.html 我们知道,在 C++98/03 中的对象初始化方法有很多种,请看下面的代码: 2 .为了统一初始化方式,并且让初始化行为具有确定的效果,C++11 中提出了列表初始化(List-initialization)的概念。 3 . 在上面我们已经看到了,对于普通数组和

    2024年02月13日
    浏览(31)
  • 【lambda函数】lambda()函数

    lambda表达式书写格式: 咱们一个个来解释: [capture-list] :捕捉列表,该列表总是出现在lambda函数的开始位置,编译器根据 [] 来判断接下来的代码是否为 lambda 函数,捕捉列表能够捕捉上下文中的变量供lambda函数使用。 不能省略 。 (parameters) : 参数列表,与普通函数的参数列

    2024年02月13日
    浏览(16)
  • 【Terraform学习】使用 Terraform创建Lambda函数启动EC2(Terraform-AWS最佳实战学习)

     本站以分享各种运维经验和运维所需要的技能为主 《python》:python零基础入门学习 《shell》:shell学习 《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战 《k8》暂未更新 《docker学习》暂未更新 《ceph学习》ceph日常问题解决分享 《日志收集》ELK+各种中间件 《运

    2024年02月11日
    浏览(38)
  • JDK1.8新特性(部分)【Lambda表达式、函数式接口】--学习JavaEE的day41

    day41 JDK1.8新特性简介 速度更快 - 优化底层源码,比如HashMap、ConcurrentHashMap 代码更少 - 添加新的语法Lambda表达式 强大的Stream API 便于并行 最大化减少空指针异常 - Optional Lambda表达式 简介 Lambda是一个匿名函数(方法), 允许把函数作为一个方法的参数 。利用Lambda表达式可以写出

    2024年04月25日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包