C++中的Lambda函数详解

目录
  • 一 函数语法
  • 二 函数应用
    • 1、在普通函数中使用
    • 2、在qt信号槽中使用
    • 3、在std::sort排序函数中的使用
  • 三 总结

一 函数语法

我们平时调用函数的时候,都是需要被调用函数的函数名,但是匿名函数就不需要函数名,而且直接写在需要调用的地方,对于以前没用过的小伙伴来说,第一眼看见了这语法可能很迷惑。

C++11的基本语法格式为:

[capture](parameters) -> return_type { /* ... */ }

(1) [capture] :[]内为外部变量的传递方式,值、引用等,如下

[]        //表示的是在lambda定义之前的域,对外部参数的调用;
[=]       //表示外部参数直接传值
[&]       //表示外部参数传引用,可修改值。当默认捕获符是 & 时,后继的简单捕获符必须不以 & 开始。而当默认捕获符是 = 时,后继的简单捕获符必须以 & 开始。
[x, &y]   //x is captured by value, y is captured by reference
[&, x]    //x is explicitly captured by value. Other variables will be captured by reference
[=, &z]   //z is explicitly captured by reference. Other variables will be captured by value

(2)(parameters) :()内为形参,和普通函数的形参一样。
(3)-> return_type:->后面为lambda函数的返回类型,如 -> int-> string等。一般情况下,编译器推出lambda函数的返回值,所以这部分可以省略不写。
(4){ /* … */ }:{}内为函数主体,和普通函数一样。

二 函数应用

1、在普通函数中使用

首先是定义,执行下面这句,不会运行函数 !!!

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

上面代码,你知道lambda函数返回类型为int类型,但是函数左边不能直接赋值给int变量(编译器会报错),因为此处为lambda函数的定义,所以左边为函数指针类型变量,一般懒得写函数指针类型,就直接赋值给auto类型变量,如下。

    auto add = [](int a,int b) ->int {  return a + b;   };

下面才是函数的使用、运行!!!
如何运行lambda函数并获取函数返回值?执行函数需要看下面代码:

    auto add = [](int a,int b) ->int {  return a + b;   };
    int result  = add(1,2);

又或者如下:

auto add = [](int a,int b) ->int {  return a + b;   };
int(*func_ptr)(int,int) = add ;
int result = func_ptr(1,2);

2、在qt信号槽中使用

我觉得labmda函数非常适合在信号槽中使用。
(1)返回的函数指针可以直接用在connect函数中,刚好契合。
(2)该槽函数可能比较简单,只有这个地方使用,可以省去槽函数声明,使代码看上去更加简便,且业务代码更加集中。
基本使用

    connect(sys, &SYSClass::sig_1, this, [=](int index)
    {
        ......
    });

绑定信号槽的时候定义lambda函数,当收到信号的时候才执行槽函数,即lambda函数。
使用示范
在mTime时间后执行动画,动画执行后delete对象,非常适合弹窗关闭时,窗口关闭的动画操作。(widgetPtr为弹窗的指针)

    QTimer::singleShot(mTime,widgetPtr,[=]()
    {
        QPropertyAnimation *pAnimation = new QPropertyAnimation(widgetPtr,"windowOpacity",widgetPtr);
        pAnimation->setDuration(1000);
        pAnimation->setEasingCurve(QEasingCurve::InCirc);
        pAnimation->setStartValue(1.0);
        pAnimation->setEndValue(0.0);
        pAnimation->start();
        connect(pAnimation,&QPropertyAnimation::finished,[=]{
            delete widgetPtr;
        });
    });

3、在std::sort排序函数中的使用

在标准库的排序函数使用中,可以使用函数回调的方式自定义排序的比较规则。
(1)sort函数提供排序算法;(2)floatList为容器变量,提供数据结构和数据;(3)他们两个之间使用迭代器连接。理解如下图:

而我们sort函数可以使用第三个参数(函数回调方式)作为比较依据进行排序,该参数就可以写成lambda函数,这样比较方法写在排序函数这里,可以使得代码更加直白、简便、集中。参考代码如下:

std::sort( floatList, floatList + N, [](float a, float b)
		{
            return a < b;
        });

上面lambda函数,是sort函数中的迭代器每次运行做排序比较的时候就调用。
注意:
(1)lambda函数参数为( float , float ),类型必须与容器的元素类型一致。
(2)运行时,迭代器自动帮你把参数传入回调函数。
(3)回调函数返回值固定为bool,这里可以不写,由编译器自动确定。

三 总结

lambda函数定义后返回的是函数指针类型,即如:std::function<int(int,int)>,所以一般很少使用,我们在很多代码中也很少看到。
正常情况下,lambda函数相对普通函数的定义和使用其实没什么优势。但是某些使用到函数指针的场合下,我们就可以酌情考虑使用,特别是函数指针作为函数参数的时候,比如qt的信号槽、回调函数等,使用起来即方便,又显得代码高大上,简直就完美O(∩_∩)O。

到此这篇关于C++中的Lambda函数详解的文章就介绍到这了,更多相关C++ Lambda函数内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++ 中的Lambda表达式写法

    小喵的唠叨话: 寒假之后,小喵在家里无所事事,最近用C++写代码的时候,用到了std::sort这个函数,每次用这个函数,小喵似乎都得查一下lambda表达式的写法.正好最近很闲,不如总结一下. 在Bing上搜索 C++ lambda ,第一条记录就是MSDN上的C++ lambda的介绍.本文也是基于这篇文章来写的. 那么接下来,我们分几个部分来介绍. 一.什么是Lambda表达式 MSDN上对lambda表达式的解释: 在 C++ 11 中,lambda 表达式(通常称为 "lambda&q

  • C++中的Lambda表达式及表达式语句

    目录 一.概念 二.左值与右值 三.类型转换 四.操作符 五.思考 1.思考下面x变量是左值还是右值,有什么特性? 2.思考一下以下赋值操作符的原始代码是怎样的? 3.思考以下代码做了什么事情? 一.概念 定义:表达式由一到多个操作数组成,可以求值并通常会返回求值结果: 最基本表达式:变量.字面值,通常包含操作符: 操作符特性: 1.接收几个操作数:一元.二元.三元: 2.对类型有要求(可能涉及类型转换): 3.操作数是左值还是右值: 4.结果的类型: 5.结果是左值还是右值: 6.优先级与结合

  • C++Lambda表达式详解

    目录 概述 语法分析 捕获列表 关键字声明 示例 捕获列表按值传递 总结 概述 C++ 11 中的 Lambda 表达式用于定义并创建匿名的函数对象,以简化编程工作.Lambda 的语法形式如下: [捕获列表] (参数) mutable 或 exception 声明 -> 返回值类型 {函数体} //计算两个值的和 auto func = [](int a, int b) -> int{return a+b;}; //当返回值的类型是确定时,可以忽略返回值 auto func = [](int

  • C++中Lambda表达式的语法与实例

    目录 概述 语法分析 捕获列表 关键字声明 mutable exception 示例 捕获列表按值传递 捕获列表按引用传递 总结 概述 C++ 11 中的 Lambda 表达式用于定义并创建匿名的函数对象,以简化编程工作.Lambda 的语法形式如下: [捕获列表] (参数) mutable 或 exception 声明 -> 返回值类型 {函数体} //计算两个值的和 auto func = [](int a, int b) -> int{return a+b;}; //当返回值的类型是确定

  • C++中的Lambda函数详解

    目录 一 函数语法 二 函数应用 1.在普通函数中使用 2.在qt信号槽中使用 3.在std::sort排序函数中的使用 三 总结 一 函数语法 我们平时调用函数的时候,都是需要被调用函数的函数名,但是匿名函数就不需要函数名,而且直接写在需要调用的地方,对于以前没用过的小伙伴来说,第一眼看见了这语法可能很迷惑. C++11的基本语法格式为: [capture](parameters) -> return_type { /* ... */ } (1) [capture] :[]内为外部变量的传递方

  • C++ lambda函数详解

    目录 Lambda 表达式 基础 1. 值捕获 2. 引用捕获 3. 隐式捕获 4. 表达式捕获 泛型 Lambda 函数对象包装器 Lambda 表达式 Lambda 表达式是现代 C++ 中最重要的特性之一,而 Lambda 表达式,实际上就是提供了一个类似匿名函数的特性, 而匿名函数则是在需要一个函数,但是又不想费力去命名一个函数的情况下去使用的.这样的场景其实有很多很多, 所以匿名函数几乎是现代编程语言的标配. 基础 Lambda 表达式的基本语法如下: [捕获列表](参数列表) mut

  • javascript中Array()数组函数详解

    在程序语言中数组的重要性不言而喻,JavaScript中数组也是最常使用的对象之一,数组是值的有序集合,由于弱类型的原因,JavaScript中数组十分灵活.强大,不像是Java等强类型高级语言数组只能存放同一类型或其子类型元素,JavaScript在同一个数组中可以存放多种类型的元素,而且是长度也是可以动态调整的,可以随着数据增加或减少自动对数组长度做更改. Array()是一个用来构建数组的内建构造器函数.数组主要由如下三种创建方式: array = new Array() array =

  • COM组件中调用JavaScript函数详解及实例

    COM组件中调用JavaScript函数详解及实例 要求是很简单的,即有COM组件A在IE中运行,使用JavaScript(JS)调用A的方法longCalc(),该方法是一个耗时的操作,要求通知IE当前的进度.这就要求使用回调函数,设其名称为scriptCallbackFunc.实现这个技术很简单: 1 .组件方(C++) 组件A 的方法在IDL中定义: [id(2)] HRESULT longCalc([in] DOUBLE v1, [in] DOUBLE v2, [in, optional

  • 对Python3中的input函数详解

    下面介绍python3中的input函数及其在python2及pyhton3中的不同. python3中的ininput函数,首先利用help(input)函数查看函数信息: 以上信息说明input函数在python中是一个内建函数,其从标准输入中读入一个字符串,并自动忽略换行符. 也就是说所有形式的输入按字符串处理,如果想要得到其他类型的数据进行强制类型转化.默认情况下没有 提示字符串(prompt  string),在给定提示字符串下,会在读入标准输入前标准输出提示字符串.如果遇 文件结束符

  • 对TensorFlow中的variables_to_restore函数详解

    variables_to_restore函数,是TensorFlow为滑动平均值提供.之前,也介绍过通过使用滑动平均值可以让神经网络模型更加的健壮.我们也知道,其实在TensorFlow中,变量的滑动平均值都是由影子变量所维护的,如果你想要获取变量的滑动平均值需要获取的是影子变量而不是变量本身. 1.滑动平均值模型文件的保存 import tensorflow as tf if __name__ == "__main__": v = tf.Variable(0.,name="

  • 对Tensorflow中的矩阵运算函数详解

    tf.diag(diagonal,name=None) #生成对角矩阵 import tensorflowas tf; diagonal=[1,1,1,1] with tf.Session() as sess: print(sess.run(tf.diag(diagonal))) #输出的结果为[[1 0 0 0] [0 1 0 0] [0 0 1 0] [0 0 0 1]] tf.diag_part(input,name=None) #功能与tf.diag函数相反,返回对角阵的对角元素 imp

  • python中的 zip函数详解及用法举例

    python中zip()函数用法举例 定义:zip([iterable, ...]) zip()是Python的一个内建函数,它接受一系列可迭代的对象作为参数,将对象中对应的元素打包成一个个tuple(元组),然后返回由这些tuples组成的list(列表).若传入参数的长度不等,则返回list的长度和参数中长度最短的对象相同.利用*号操作符,可以将list unzip(解压),看下面的例子就明白了: 示例1 x = [1, 2, 3] y = [4, 5, 6] z = [7, 8, 9] x

  • SQL中的开窗函数详解可代替聚合函数使用

    在没学习开窗函数之前,我们都知道,用了分组之后,查询字段就只能是分组字段和聚合的字段,这带来了极大的不方便,有时我们查询时需要分组,又需要查询不分组的字段,每次都要又到子查询,这样显得sql语句复杂难懂,给维护代码的人带来很大的痛苦,然而开窗函数出现了,曙光也来临了.如果要想更具体了解开窗函数,请看书<程序员的SQL金典>,开窗函数在mysql不能使用. 开窗函数与聚合函数一样,都是对行的集合组进行聚合计算.它用于为行定义一个窗口(这里的窗口是指运算将要操作的行的集合),它对一组值进行操作,不

  • C语言中随机数rand()函数详解

      在生活中很多场景下都需要产生随机数,比如抽奖,打牌,游戏等场景下就需要使用随机数.在C语言标准库函数里面有专门用来产生随机数的函数rand,它的函数原型如下: int __cdecl rand(void);   rand函数没有参数,它的返回值就是随机数.下面通过一个简单的例子来测试一下rand函数. #include <stdio.h> #include <stdlib.h> int main(int argc, char** argv) { int i; i = rand(

随机推荐