返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++ lambda函数怎么使用
  • 565
分享到

C++ lambda函数怎么使用

2023-07-05 03:07:44 565人浏览 独家记忆
摘要

本篇内容介绍了“c++ lambda函数怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Lambda 表达式Lambda 表

本篇内容介绍了“c++ lambda函数怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

    Lambda 表达式

    Lambda 表达式是现代 C++ 中最重要的特性之一,而 Lambda 表达式,实际上就是提供了一个类似匿名函数的特性, 而匿名函数则是在需要一个函数,但是又不想费力去命名一个函数的情况下去使用的。这样的场景其实有很多很多, 所以匿名函数几乎是现代编程语言的标配。

    基础

    Lambda 表达式的基本语法如下:

    [捕获列表](参数列表) mutable(可选) 异常属性 -> 返回类型 {
    // 函数体
    }

    上面的语法规则除了 [捕获列表] 内的东西外,其他部分都很好理解,只是一般函数的函数名被略去, 返回值使用了一个 -> 的形式进行(我们在上一节前面的尾返回类型已经提到过这种写法了)。

    所谓捕获列表,其实可以理解为参数的一种类型,Lambda 表达式内部函数体在默认情况下是不能够使用函数体外部的变量的, 这时候捕获列表可以起到传递外部数据的作用。根据传递的行为,捕获列表也分为以下几种:

    1. 值捕获

    与参数传值类似,值捕获的前提是变量可以拷贝,不同之处则在于,被捕获的变量在 Lambda 表达式被创建时拷贝, 而非调用时才拷贝:

    void lambda_value_capture() {    int value = 1;    auto copy_value = [value] {        return value;    };    value = 100;    auto stored_value = copy_value();    std::cout << "stored_value = " << stored_value << std::endl;    // 这时, stored_value == 1, 而 value == 100.    // 因为 copy_value 在创建时就保存了一份 value 的拷贝}
    2. 引用捕获

    与引用传参类似,引用捕获保存的是引用,值会发生变化。

    void lambda_reference_capture() {    int value = 1;    auto copy_value = [&value] {        return value;    };    value = 100;    auto stored_value = copy_value();    std::cout << "stored_value = " << stored_value << std::endl;    // 这时, stored_value == 100, value == 100.    // 因为 copy_value 保存的是引用}
    3. 隐式捕获

    手动书写捕获列表有时候是非常复杂的,这种机械性的工作可以交给编译器来处理,这时候可以在捕获列表中写一个 & 或 = 向编译器声明采用引用捕获或者值捕获.

    总结一下,捕获提供了 Lambda 表达式对外部值进行使用的功能,捕获列表的最常用的四种形式可以是:

    a. [] 空捕获列表
    b. [name1, name2, ...] 捕获一系列变量
    c. [&] 引用捕获, 让编译器自行推导引用列表
    d. [=] 值捕获, 让编译器自行推导值捕获列表

    4. 表达式捕获

    这部分内容需要了解后面马上要提到的右值引用以及智能指针

    上面提到的值捕获、引用捕获都是已经在外层作用域声明的变量,因此这些捕获方式捕获的均为左值,而不能捕获右值。

    C++14 给与了我们方便,允许捕获的成员用任意的表达式进行初始化,这就允许了右值的捕获, 被声明的捕获变量类型会根据表达式进行判断,判断方式与使用 auto 本质上是相同的:

    #include <iOStream>#include <memory>  // std::make_unique#include <utility> // std::movevoid lambda_expression_capture() {    auto important = std::make_unique<int>(1);    auto add = [v1 = 1, v2 = std::move(important)](int x, int y) -> int {        return x+y+v1+(*v2);    };    std::cout << add(3,4) << std::endl;}

    在上面的代码中,important 是一个独占指针,是不能够被 "=" 值捕获到,这时候我们可以将其转移为右值,在表达式中初始化。

    泛型 Lambda

    上一节中我们提到了 auto 关键字不能够用在参数表里,这是因为这样的写法会与模板的功能产生冲突。 但是 Lambda 表达式并不是普通函数,所以在没有明确指明参数表类型的情况下,Lambda 表达式并不能够模板化。 幸运的是,这种麻烦只存在于 C++11 中,从 C++14 开始,Lambda 函数的形式参数可以使用 auto 关键字来产生意义上的泛型:

    auto add = [](auto x, auto y) {    return x+y;};add(1, 2);add(1.1, 2.2);

    函数对象包装器

    这部分内容虽然属于标准库的一部分,但是从本质上来看,它却增强了 C++ 语言运行时的能力, 这部分内容也相当重要,所以放到这里来进行介绍。

    std::function

    Lambda 表达式的本质是一个和函数对象类型相似的类类型(称为闭包类型)的对象(称为闭包对象), 当 Lambda 表达式的捕获列表为空时,闭包对象还能够转换为函数指针值进行传递,例如:

    #include <iostream>using foo = void(int); // 定义函数类型, using 的使用见上一节中的别名语法void functional(foo f) { // 参数列表中定义的函数类型 foo 被视为退化后的函数指针类型 foo*    f(1); // 通过函数指针调用函数}int main() {    auto f = [](int value) {        std::cout << value << std::endl;    };    functional(f); // 传递闭包对象,隐式转换为 foo* 类型的函数指针值    f(1); // lambda 表达式调用    return 0;}

    上面的代码给出了两种不同的调用形式,一种是将 Lambda 作为函数类型传递进行调用, 而另一种则是直接调用 Lambda 表达式,在 C++11 中,统一了这些概念,将能够被调用的对象的类型, 统一称之为可调用类型。而这种类型,便是通过 std::function 引入的。

    C++11 std::function 是一种通用、多态的函数封装, 它的实例可以对任何可以调用的目标实体进行存储、复制和调用操作, 它也是对 C++ 中现有的可调用实体的一种类型安全的包裹(相对来说,函数指针的调用不是类型安全的), 换句话说,就是函数的容器。当我们有了函数的容器之后便能够更加方便的将函数、函数指针作为对象进行处理。 例如:

    #include <functional>#include <iostream>int foo(int para) {    return para;}int main() {    // std::function 包装了一个返回值为 int, 参数为 int 的函数    std::function<int(int)> func = foo;    int important = 10;    std::function<int(int)> func2 = [&](int value) -> int {        return 1+value+important;    };    std::cout << func(10) << std::endl;    std::cout << func2(10) << std::endl;}std::bind 和 std::placeholder

    而 std::bind 则是用来绑定函数调用的参数的, 它解决的需求是我们有时候可能并不一定能够一次性获得调用某个函数的全部参数,通过这个函数, 我们可以将部分调用参数提前绑定到函数身上成为一个新的对象,然后在参数齐全后,完成调用。 例如:

    int foo(int a, int b, int c) {    ;}int main() {    // 将参数1,2绑定到函数 foo 上,    // 但使用 std::placeholders::_1 来对第一个参数进行占位    auto bindFoo = std::bind(foo, std::placeholders::_1, 1,2);    // 这时调用 bindFoo 时,只需要提供第一个参数即可    bindFoo(1);}

    提示:注意 auto 关键字的妙用。有时候我们可能不太熟悉一个函数的返回值类型, 但是我们却可以通过 auto 的使用来规避这一问题的出现。

    “C++ lambda函数怎么使用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

    --结束END--

    本文标题: C++ lambda函数怎么使用

    本文链接: https://lsjlt.com/news/349216.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    猜你喜欢
    • C++ lambda函数怎么使用
      本篇内容介绍了“C++ lambda函数怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Lambda 表达式Lambda 表...
      99+
      2023-07-05
    • C++中的Lambda函数怎么使用
      这篇文章主要讲解了“C++中的Lambda函数怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++中的Lambda函数怎么使用”吧!一 函数语法我们平时调用函数的时候,都是需要被调用...
      99+
      2023-06-22
    • Python lambda函数怎么使用
      本篇内容介绍了“Python lambda函数怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、lambda函数的定义&a...
      99+
      2023-07-02
    • C++11中的lambda匿名函数怎么使用
      本篇内容主要讲解“C++11中的lambda匿名函数怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++11中的lambda匿名函数怎么使用”吧!lambda 源自希腊字母表中第 11 ...
      99+
      2023-07-04
    • Python中怎么使用Lambda函数
      这篇文章主要介绍了Python中怎么使用Lambda函数,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。引言Lambda 函数(也称为匿名函数)是函数式编程中的核心概念之一。支...
      99+
      2023-06-14
    • lambda函数怎么用
      这篇文章主要介绍lambda函数怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!lambda函数也叫匿名函数,就是没有函数名的函数。lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象。la...
      99+
      2023-06-02
    • Python当中Lambda函数怎么使用
      本文小编为大家详细介绍“Python当中Lambda函数怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python当中Lambda函数怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。什么是Lamb...
      99+
      2023-07-06
    • lambda函数python怎么用
      python 中的 lambda 函数是匿名函数,用于定义执行单个表达式的函数。它具有简洁、匿名和一次性使用的优点。lambda 函数的语法为:lambda 参数列表: 表达式,其中参数...
      99+
      2024-05-13
      python
    • C++lambda函数详解
      目录Lambda 表达式基础1. 值捕获2. 引用捕获3. 隐式捕获4. 表达式捕获泛型 Lambda函数对象包装器Lambda 表达式 Lambda 表达式是现代 C++ 中最重要...
      99+
      2023-02-13
      C++ lambda表达式 C++ lambda函数
    • 什么时候使用Lambda函数?
      原文来自:1前言Python 中定义函数有两种方法,一种是用常规方式 def 定义,函数要指定名字,第二种是用 lambda 定义,不需要指定名字,称为 Lambda 函数。Lambda 函数又称匿名函数,匿名函数就是没有名字的函数,函数没...
      99+
      2023-06-02
    • python中lambda函数怎么用
      Python中lambda函数是一种匿名函数,也称为内联函数或者函数字面量。可以用来创建简单的、单行的函数,通常用于需要一个函数,但是只使用一次,不需要命名的情况。lambda 函数的基本语法为“lambda arguments: expr...
      99+
      2023-12-13
      python Lambda函数
    • C++11中匿名函数lambda的使用详解
      目录一、lambda基础介绍二、lambda使用例子2.1 STL算法中的回调函数2.2 回调函数2.3 多线程编程三、总结官方介绍: C++ lambda是C++11新增的一种匿名...
      99+
      2023-05-18
      C++11匿名函数lambda使用 C++11匿名函数lambda C++11匿名函数
    •  Python匿名函数lambda怎么用
      今天小编给大家分享一下 Python匿名函数lambda怎么用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1.前...
      99+
      2023-06-29
    • python如何使用lambda函数
      小编给大家分享一下python如何使用lambda函数,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!lambda 函数的动画演示...
      99+
      2024-04-02
    • Lambda和高阶函数怎么在Kotlin 中使用
      本篇文章为大家展示了Lambda和高阶函数怎么在Kotlin 中使用,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Lambda是什么Lambda是一种函数的表示方式(言外之意也就是说一个Lambda...
      99+
      2023-05-30
      kotlin lambda 高阶函数
    • C++ 函数的 lambda 표达式的使用场景是什么?
      lambda 表达式是匿名函数,可用于简化代码、作为回调函数或参数化函数,优点包括简化代码、减少冗余和提高灵活性。 C++ 函数中 lambda 表达式的使用场景 lambda 表达式...
      99+
      2024-04-19
      c++ lambda 作用域
    • C++匿名函数lambda详解
      匿名函数lambda 一、匿名函数的基本语法二、捕获列表2.1、值捕获2.2、引用捕获2.3、隐式捕获2.4、空捕获列表2.5、表达式捕获2.6、泛型 Lambda2.7、可变lambda2....
      99+
      2023-10-23
      c++ linux 开发语言 服务器 算法
    • C++中的Lambda函数详解
      目录一 函数语法二 函数应用1、在普通函数中使用2、在qt信号槽中使用3、在std::sort排序函数中的使用三 总结一 函数语法 我们平时调用函数的时候,都是需要被调用函数的函数名...
      99+
      2024-04-02
    • C# Lambda Expression怎么用
      这篇文章主要介绍了C# Lambda Expression怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。我们处理一些删除操作,会选择写SQL语句或者执行存储过程,例如:...
      99+
      2023-06-17
    • C++和C#中的lambda方法怎么使用
      这篇文章主要讲解了“C++和C#中的lambda方法怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++和C#中的lambda方法怎么使用”吧!一、语法定义首先我们看下 C++ 语法...
      99+
      2023-07-02
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作