我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C++11中的lambda匿名函数怎么使用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C++11中的lambda匿名函数怎么使用

本篇内容主要讲解“C++11中的lambda匿名函数怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++11中的lambda匿名函数怎么使用”吧!

lambda 源自希腊字母表中第 11 位的 λ,在计算机科学领域,它则被用来表示一种匿名函数。所谓匿名函数,简单地理解就是没有名称的函数,又常被称为 lambda 函数或者 lambda 表达式。

1. lambda匿名函数的定义

[capture](parameters)mutable ->return-type{statement}

参数说明:

  • [capture]:捕捉列表,[] 是lambda引出符,编译器根据该引出符判断接下来的代码是否是lambda函数。捕捉列表用于捕捉父域中的变量以供lambda函数使用,捕捉列表可以由多个项组成,用","分割。[var]表示以值传递方式捕捉父域中的变量var,[=]表示以值传递方式捕捉父域中的所有变量(包括this),[&var]表示以引用传递方式捕捉父域中的变量var,[&]表示以引用传递方式捕捉父域中的所有变量(包括this),[this]表示以值传递方式捕捉当前的this指针。

  • (parameters):参数列表,与普通函数的参数列表一致,如果不需要参数传递,则可以连同括号()一起省略。

  • mutable:mutable修饰符,默认情况下,lambda函数总是一个const函数,mutable可以取消其常量性。在使用该修饰符时,参数列表不可省略(即使参数为空)。

  • ->return-type:返回类型,用追踪返回类型形式声明函数的返回类型,不需要返回值的时候可以连同符号->一起省略。在返回类型明确的情况下,也可以省略该部分,让编译器对返回类型进行推导。

  • {statement}:函数体,内容与普通函数一样,不过除了可以使用参数之外,还可以使用所有捕获的变量。

lambda匿名函数中的[外部变量]

外部变量格式功能
[]空方括号表示当前 lambda 匿名函数中不导入任何外部变量。
[=]只有一个 = 等号,表示以值传递的方式导入所有外部变量;
[&]只有一个 & 符号,表示以引用传递的方式导入所有外部变量;
[val1,val2,...]表示以值传递的方式导入 val1、val2 等指定的外部变量,同时多个变量之间没有先后次序;
[&val1,&val2,...]表示以引用传递的方式导入 val1、val2等指定的外部变量,多个变量之间没有前后次序;
[val,&val2,...]以上 2 种方式还可以混合使用,变量之间没有前后次序。
[=,&val1,...]表示除 val1 以引用传递的方式导入外,其它外部变量都以值传递的方式导入。
[this]表示以值传递的方式导入当前的 this 指针。

注意,单个外部变量不允许以相同的传递方式导入多次。例如 [=,val1] 中,val1 先后被以值传递的方式导入了 2 次,这是非法的。

最简单的lambda匿名函数

[]{}

此 lambda 匿名函数未引入任何外部变量([] 内为空),也没有传递任何参数,没有指定 mutable、noexcept 等关键字,没有返回值和函数体。所以,这是一个没有任何功能的 lambda 匿名函数。

2. lambda匿名函数的使用

2.1 lambda匿名函数的定义和使用

#include <iostream>#include <algorithm>using namespace std;int main(){    int num[4] = { 4, 2, 3, 1 };    // 对数组 num 中的元素进行升序排序    sort(num, num + 4, [=](int x, int y) -> bool { return x < y; });    for (int n : num) {        cout << n << " ";    }    return 0;}

以上程序通过调用 sort() 函数实现了对 num 数组中元素的升序排序,其中就用到了 lambda 匿名函数。而如果使用普通函数,需以如下代码实现:

#include <iostream>#include <algorithm>using namespace std;// 自定义的升序排序规则bool sort_up(int x, int y) {    return  x < y;}int main(){    int num[4] = { 4, 2, 3, 1 };    // 对数组 num 中的元素进行升序排序    sort(num, num + 4, sort_up);    for (int n : num) {        cout << n << " ";    }    return 0;}

此程序中 sort_up() 函数的功能和上一个程序中的 lambda 匿名函数完全相同。显然在类似的场景中,使用 lambda 匿名函数更有优势。

除此之外,虽然 lambda 匿名函数没有函数名称,但我们仍可以为其手动设置一个名称,比如:

#include <iostream>using namespace std;int main(){    // display 即为 lambda 匿名函数的函数名    auto display = [](int a,int b) -> void{cout << a << " " << b;};    // 调用 lambda 函数    display(10,20); // 输出:10 20    return 0;}

可以看到,程序中使用 auto 关键字为 lambda 匿名函数设定了一个函数名,由此我们即可在作用域内调用该函数。

2.2 值传递和引用传递的区别

#include <iostream>using namespace std;// 全局变量int all_num = 0;int main(){    // 局部变量    int num_1 = 1;    int num_2 = 2;    int num_3 = 3;    cout << "lambda1:\n";    auto lambda1 = [=] {        // 全局变量可以访问甚至修改        all_num = 10;        // 函数体内只能使用外部变量,而无法对它们进行修改        cout << num_1 << " "            << num_2 << " "            << num_3 << endl;    };    lambda1();    cout << all_num << endl;    cout << "lambda2:\n";    auto lambda2 = [&] {        all_num = 100;        num_1 = 10;        num_2 = 20;        num_3 = 30;        cout << num_1 << " "            << num_2 << " "            << num_3 << endl;    };    lambda2();    cout << all_num << endl;    return 0;}

程序执行结果为:

lambda1:
1 2 3
10
lambda2:
10 20 30
100

可以看到,在创建 lambda1 和 lambda2 匿名函数的作用域中,有 num_1、num_2 和 num_3 这 3 个局部变量,另外还有 all_num 全局变量。其中,lambda1 匿名函数是以 [=] 值传递的方式导入的局部变量,这意味着默认情况下,此函数内部无法修改这 3 个局部变量的值,但全局变量 all_num 除外。相对地,lambda2 匿名函数以 [&] 引用传递的方式导入这 3 个局部变量,因此在该函数的内部就可以访问这 3 个局部变量,还可以任意修改它们。同样,也可以访问甚至修改全局变量。当然,如果我们想在 lambda1 匿名函数的基础上修改外部变量的值,可以借助 mutable 关键字,例如:

auto lambda1 = [=]() mutable{    num_1 = 10;    num_2 = 20;    num_3 = 30;    // 函数体内只能使用外部变量,而无法对它们进行修改    cout << num_1 << " "         << num_2 << " "         << num_3 << endl;};

由此,就可以在 lambda1 匿名函数中修改外部变量的值。但需要注意的是,这里修改的仅是 num_1、num_2、num_3 拷贝的那一份的值,真正外部变量的值并不会发生改变。

2.3 执行抛出异常类型

#include <iostream>using namespace std;int main(){    auto except = []()throw(int) {        throw 10;    };    try {        except();    }    catch (int) {        cout << "捕获到了整形异常";// 输出:捕获到了整形异常    }    return 0;}

可以看到,except 匿名数组中指定函数体中可以抛出整形异常,因此当函数体中真正发生整形异常时,可以借助 try-catch 块成功捕获并处理。

在此基础上,再看一下反例:

#include <iostream>using namespace std;int main(){    auto except1 = []()noexcept {        throw 100;    };    auto except2 = []()throw(char) {        throw 10;    };    try {        except1();        except2();    }    catch (int) {        cout << "捕获到了整形异常" << endl;    }    return 0;}

此程序运行会直接崩溃,原因很简单,except1 匿名函数指定了函数体中不发生任何异常,但函数体中却发生了整形异常;except2 匿名函数指定函数体可能会发生字符异常,但函数体中却发生了整形异常。由于指定异常类型和真正发生的异常类型不匹配,导致 try-catch 无法捕获,最终程序运行崩溃。

如果不使用 noexcept 或者 throw(),则 lambda 匿名函数的函数体中允许发生任何类型的异常。

到此,相信大家对“C++11中的lambda匿名函数怎么使用”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C++11中的lambda匿名函数怎么使用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

C++11中的lambda匿名函数怎么使用

本篇内容主要讲解“C++11中的lambda匿名函数怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++11中的lambda匿名函数怎么使用”吧!lambda 源自希腊字母表中第 11
2023-07-04

C++11中匿名函数lambda的使用详解

我最早接触lambda的概念是在matlab中,那时候在做数值模拟的课题,lambda可以快速定义简单的函数,当时觉得好方便。任何语言都有这个功能,下面来看看C++11新引入的lambda是如何使用的吧
2023-05-18

 Python匿名函数lambda怎么用

今天小编给大家分享一下 Python匿名函数lambda怎么用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1.前言在 Py
2023-06-29

python如何使用匿名函数lambda

这篇文章主要介绍python如何使用匿名函数lambda,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!匿名函数 lambda所谓匿名,意即不再使用 def 语句这样标准的形式定义一个函数。lambda 只是一个表达式
2023-06-03

C#中的匿名函数、lambda表达式解读

这篇文章主要介绍了C#中的匿名函数、lambda表达式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-01-28

Python匿名函数lambda的用法

本篇内容主要讲解“Python匿名函数lambda的用法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python匿名函数lambda的用法”吧!Python内置了多个关键字,今天我们来介绍下其
2023-06-02

C++ 函数声明中的 lambda 表达式:探索匿名函数的灵活使用

lambda 表达式是一种匿名函数,可在函数声明中创建并传递函数对象,提高代码灵活性和可读性。其语法为:[捕获列表] (参数列表) -> 返回类型 { 函数体 }。在实际应用中,它提供了比函数指针更简洁、灵活的方法,例如创建匿名函数 lam
C++ 函数声明中的 lambda 表达式:探索匿名函数的灵活使用
2024-05-03

C#匿名函数和匿名方法的使用

本文主要介绍了C#匿名函数和匿名方法的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-05-14

static匿名函数怎么在C#9 中使用

static匿名函数怎么在C#9 中使用?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。匿名方法的代价匿名方法代价不低,因为它有 委托调用 方面的开销,什么意思呢
2023-06-14

C++中的Lambda函数怎么使用

这篇文章主要讲解了“C++中的Lambda函数怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++中的Lambda函数怎么使用”吧!一 函数语法我们平时调用函数的时候,都是需要被调用
2023-06-22

Python中的lambda匿名函数和三元运算符怎么用

这篇文章主要讲解了“Python中的lambda匿名函数和三元运算符怎么用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python中的lambda匿名函数和三元运算符怎么用”吧!匿名函数什
2023-06-30

C++11中的lambda表达式怎么使用

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

一文详解C++11中的lambda函数

小编可以明确告诉大家:lambda函数是C++11中最重要的,使用最广泛的,最具现代风格的内容,lambda函数的出现改变了C++编程的思维方式。所以快和小编学习一下C++11中lambda函数的使用吧
2023-02-07

C++ lambda函数怎么使用

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

C#匿名函数和匿名方法如何使用

这篇文章主要讲解了“C#匿名函数和匿名方法如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#匿名函数和匿名方法如何使用”吧!在 C# 中,可以将匿名函数简单的理解为没有名称只有函数主
2023-07-05

C++11的lambda表达式怎么使用

这篇文章主要讲解了“C++11的lambda表达式怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++11的lambda表达式怎么使用”吧!可变lambda假设有如下vector,保
2023-06-19

使用 Lambda 取代 Android 中的匿名类

Lambda是第十一个希腊字母,大写Λ,小写λ,额,跑题了…Lambda表达式 是Java8的新特性之一:Lambda表达式函数式接口流API默认方法新的DateTime API Lambda表达式 取代了匿名类 ,取消了模板,允许用函数式
2022-06-06

PHP中匿名函数怎么用

这篇文章主要介绍PHP中匿名函数怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完! PHP中的匿名函数(Anonymous functions), 也叫闭包函数(closures), 允许指定一个没有名称的函数。最
2023-06-14

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录