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

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

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

北京

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

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

看不清楚,换张图片

免费获取短信验证码

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

官方介绍:

C++ lambda是C++11新增的一种匿名函数的实现方式,可以在代码中直接定义一个函数对象。它的语法是通过关键字“[]”来定义的,括号里可以包含需要访问的外部变量。Lambda函数可以用于在STL算法中提供自定义的比较函数,或者作为std::function的参数。它的简洁和易用性使得在C++11中变得非常流行。

一、lambda基础介绍

Lambda表达式的完整声明格式如下:

[capture list](parameter list) mutable exception->
     return type { function body }
  • capture list: 用于捕获外部变量的列表,可以省略。
  • parameter list: 函数参数列表,可以省略。
  • mutable: 可选项,用于指定能否修改捕获的变量。
  • exception: 可选项,用于指定能抛出的异常。
  • return type: 可选项,用于指定返回值类型。如果省略,编译器会自动推断。
  • function body: 函数主体。

通常情况下,一个 lambda 表达式不需要如此多的关键词,更常用的声明形式如下,只需要captures、parameters、return type、body即可:

[captures] (parameters) -> return_type {body}

有一些情况下,返回类型可以从 return 语句中推导(如 auto),则返回类型可以省略。而当 lambda 表达式没有参数的时候,用于表示参数列表的括号也是可以省略的:

[captures] {body}
 
//也就是
[]{}

具体的例子:

[](){}   //定义一个没有参数和返回值的lambda表达式
[](int a, int b){ return a+b;}   //定义一个带有参数的lambda表达式
[x](int a){ return x*a;}   //定义一个捕获x的lambda表达式

Lambda表达式还可以使用默认参数值,通过在参数后面使用 "= default_value"来实现。

例如 :

[](int a, int b = 10){ return a + b;}  //定义一个带有默认参数值的lambda表达式

在捕获列表中, 你可以使用&或=来捕获外部变量。

  • & 使得lambda表达式可以修改捕获的变量。
  • = 使得lambda表达式不能修改捕获的变量(默认值)。

例如 :

int x = 10;
[&x](){x++;}  //定义一个可以修改x的lambda表达式
[=x](){x++;}  //定义一个不能修改x的lambda表达式

Lambda表达式可以通过赋值给std::function对象或者直接调用来使用。

例如 :

std::function<int(int, int)> add = [](int a, int b){ return a + b;};
int result = add(1, 2);

二、lambda使用例子

2.1 STL算法中的回调函数

STL算法如sort, for_each等需要一个可调用的对象来完成操作,这时候lambda表达式可以提供一种简洁的方式来定义这个可调用的对象。

#include <algorithm>
#include <iostream>
#include <vector>
 
int main()
{
    std::vector<int> v{3, 1, 4, 1, 5, 9, 2, 6, 5};
    std::sort(v.begin(), v.end(), [](int a, int b){ return a < b;});
    for(int x : v)
        std::cout << x << " ";
    std::cout << std::endl;
    return 0;
}

sort第三个参数可以传入一个函数,是因为 sort 使用了模板,第三个参数是一个比较函数,它是一个可以接受两个参数并返回一个bool值的函数。sort函数使用这个比较函数来确定如何排序序列中的元素。如果第三个参数省略,sort默认使用“小于”运算符进行比较。

可以使用 std::less<int> 替换 lambda 表达式,如下所示:

std::sort(v.begin(), v.end(), std::less<int>());

或者你也可以定义一个比较函数来代替 lambda:

bool myCompare(int a, int b) 
{ return a < b; }
 
 std::sort(v.begin(), v.end(), myCompare);

2.2 回调函数

在许多情况下,我们需要在某个对象的回调函数中进行某些操作,这时候lambda表达式可以提供一种简洁的方式来定义回调函数。

#include <iostream>
 
class Button
{
public:
    void setOnClick(std::function<void()> onClick) { m_onClick = onClick; }
    void click() { m_onClick(); }
private:
    std::function<void()> m_onClick;
};
 
int main()
{
    Button btn;
    btn.setOnClick([](){std::cout << "Button clicked" << std::endl;});
    btn.click();
    return 0;
}

"setOnClick" 函数接收一个 std::function<void()> 类型的参数,并将其存储在类的私有成员变量 "m_onClick" 中。std::function 是一种 C++11 标准库中的类型,它可以存储可调用的对象,如函数指针、函数对象、Lambda 表达式等,这段代码它存了一个void()的类型的调用。

"click" 函数调用了 "m_onClick",也就是之前设置的 std::function<void()> 类型的回调函数。

在 main 函数中,一个 Button 对象 "btn" 被创建并初始化。 然后调用 btn.setOnClick({std::cout << "Button clicked" << std::endl;}); 这个方法,将一个 lambda 表达式作为参数设置给 m_onClick。 最后调用 btn.click(); 触发了上面设置的 lambda 表达式。

2.3 多线程编程

在多线程编程中,我们需要启动一个新线程来执行某些操作,这时候lambda表达式可以提供一种简洁的方式来定义线程的操作。

#include <iostream>
#include <thread>
 
int main()
{
    int x = 10;
    std::thread t([&x](){ x++;});
    t.join();
    std::cout << x << std::endl;
    return 0;
}

这段代码使用了 C++11 的线程库 std::thread。在 main 函数中,一个 int 类型的变量 x 被赋值为 10。然后创建了一个 std::thread 对象 "t",该对象的构造函数接收了一个 lambda 表达式,在这个 lambda 表达式中,变量 x 的值被自增。

三、总结

在使用lambda时首先要明确它和普通函数一样,有函数地址、参数、返回值等等,使用起来不要有任何负担。第二就是掌握它复杂的使用方法需要多多使用,多多练习,C++新特性的学习有助于我们掌握更好的编程技巧。

到此这篇关于C++11中匿名函数lambda的使用详解的文章就介绍到这了,更多相关C++11匿名函数lambda内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

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

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

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

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

下载Word文档

猜你喜欢

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

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

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

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

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

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

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

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

C++的匿名函数(lambda表达式)

C++11提供了对匿名函数的支持,称为Lambda函数(也叫Lambda表达式). 它是定义和使用匿名函数对象的一种简便的方式。
C++匿名函数2024-12-03

python如何使用匿名函数lambda

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

Python匿名函数lambda的用法

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

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

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

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

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

一文搞懂Java中的lambda匿名函数

Lambda函数,也称为Lambda表达式,是Java 8版本新增的一项功能。它提供了一种简洁的方式来定义小型匿名函数,这些函数可以作为参数传递给其他方法或作为返回值使用。

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

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

使用 Lambda 取代 Android 中的匿名类

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

编程热搜

  • 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动态编译

目录