首页 > 编程语言 >c++ lambda表达式

c++ lambda表达式

时间:2023-11-12 19:22:16浏览次数:33  
标签:std 函数 int 捕获 c++ 变量 表达式 lambda

一、lambda语句介绍

在cppreference中对lambda的解释是:一个能够捕获作用域中变量的未命名函数对象

个人认为就是一个用于快速定义一个匿名函数的语句

使用格式

1.capture子句,lambda的核心,通过改变[ ]中的值,来设定捕获的范围

2.参数列表 ,可选,用于确定捕获参数的类型

3.mutable,可选,用于确定捕获参数是否可以更改

4.throw(),可选,表示抛出异常

5.返回值类型,可选,表示函数体最后的返回值是什么类型的

6.函数体

二、lambda的应用

    std::vector<int> v = {5,7,4,2,9,1};
    sort(v.begin(), v.end(), [](int a, int b){ 
        return a > b; 
    });
//自定义sort的排序为降序

这里我们的捕获列表[ ]是空的,代表着不捕获任何的外部变量,也就是说,它的作用范围只在sort内

1.值捕获

即在[ ]中写入你想要捕获的变量,如下就表示我要捕获a这个变量,然后输出它

auto pr1 = [a]{std::cout << a << " " << std::endl;};

2.引用捕获

它与值捕获的区别在于,值捕获无法在函数体内修改捕获的外部变量的值,但是引用捕获可以,如下

    int a = 4;
    auto pr1 = [a]{
        std::cout << a << " " << std::endl;
        a++;
//这里编译器会报错,是“表达式是可修改的左值”
    };
    pr1();
    auto pr2 = [&a]{
         std::cout << a << std::endl;
         a++;
//这里编译器不会报错,因为是引用捕获
    };

3.通用捕获

在上述的两种中,我们都是明确了要捕获的变量,如果我们要根据函数体内的需要来捕获就可以用[=]或者[&]

其中[=]代表着值捕获,[&]代表着引用捕获

    int a = 4;
    int b = 5;
    auto pr1 = [=]{
        std::cout << a << " " << std::endl;
        std::cout << b << std::endl;
    };
    pr1();
    auto pr2 = [&]{
         std::cout << a << std::endl;
         std::cout << ++b << std::endl;
    };
    pr2();

 

当我们想在值捕获中修改的时候就需要用到mutable这样就可以在函数体内修改值

 

标签:std,函数,int,捕获,c++,变量,表达式,lambda
From: https://www.cnblogs.com/linx000/p/17827466.html

相关文章

  • C++ 内存分区
    C/C++内存管理C/C++内存分布转载https://www.coonote.com/note/cpp-memory-management.htmlC/C++程序内存分配的几个区域:栈区(stack)在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集......
  • Word查找替换中的正则表达式
    正则表达式,多么高大上的一个叫法啊……高大上有的时候,等同于难度大……难度大有的时候,等同于高高在上……好了,又回到高大上了……其实,是工具就是要用,裱上个“太难”的框子没什么意思,还是来点实在的……********************************************************************......
  • JavaScript--正则表达式
    正则表达式判断用户名/密码varreg=/^\w{6,12}$/;varflag=reg.test(username);判断手机号,1开头并且11位数字varreg=/^[1]\d{10}$/;varflag=reg.test(tele); functionteleflag(){vartele=teleInput.value.trim();//varflag=tele.length==11......
  • 正则表达式
    正则表达式概述本质上是一些字符串,代表的是一个规则作用用来校验数据格式是否合法在一段文本中查找满足要求的要求书写规则限定符?代表前面的字符出现0次或者1次*会匹配0个或多个字符b{5}{2,6}{2,}花括号代表出现的次数(ab)+”+“代表重复出现的字符字符类......
  • c++ extern关键字
    @[TOC]什么是extern?extern是C++中的一个关键字,用于声明一个全局变量或函数,但并不分配内存或提供定义。它的主要作用是告诉编译器这个变量或函数在其他源文件中定义,编译器不应该分配内存空间或生成代码,而应该等待链接器来解析它。使用extern声明变量//在一个源文件中定义一个......
  • C++零基础教程(抽象类和接口)
    (文章目录)前言本篇文章来讲解抽象类和接口的概念,抽象类和接口都需要依靠我们之前讲解的虚函数来实现,那么我们就来看看如何使用虚函数来实现抽象类和接口吧。一、抽象类概念抽象类是一种不能直接实例化(即创建对象)的类,它被用作其他类的基类或接口。抽象类通过声明纯虚函数(没有......
  • Java学习—JAVA正则表达式
    -----生命如同寓言,其价值不在于长短,而在于内容。正则表达式定义了字符串的模式。正则表达式可以用来搜索、编辑或处理文本。正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别。1、正则表达式语法元字符描述\将下一个字符标记符、或一个向后引用、或一个八进制转义符。......
  • c++ function使用
    一、function介绍funciotn是从c++11开始支持的特性,使用它需要包含<functional>头文件在cppreference中解释为:类模板std::function是一个通用的多态函数包装器。std::function的实例可以对任何可以调用的目标实体进行存储、复制、和调用操作,这些目标实体包括普通函数、Lambda表达......
  • C++ 采用get()和put()读写文件
    在某些特殊的场景中,我们可能需要逐个读取文件中存储的字符,或者逐个将字符存储到文件中。这种情况下,就可以调用get()和put()成员方法实现。C++ostream::put()成员方法通过《C++cout.put()》一节的学习,读者掌握了如何通过执行cout.put()方法向屏幕输出单个字符。我们知道,fstr......
  • C++ 使用getline():从文件中读取一行字符串
    getline()方法从cin输入流缓冲区中读取一行字符串。在此基础上,getline()方法还适用于读取指定文件中的一行数据,本节就给大家做详细的讲解。我们知道,getline()方法定义在istream类中,而fstream和ifstream类继承自istream类,因此fstream和ifstream的类对象可以调用ge......