C++中的Lambda函数详解

 更新时间:2022年01月23日 16:43:20   作者:求知者先  
大家好,本篇文章主要讲的是C++中的Lambda函数详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览

一 函数语法

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

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函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言数组和指针的问题一道非常值得深思的笔试题

    C语言数组和指针的问题一道非常值得深思的笔试题

    今天小编就为大家分享一篇关于C语言数组和指针的问题一道非常值得深思的笔试题,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • 基于OpenCV和C++ 实现图片旋转

    基于OpenCV和C++ 实现图片旋转

    这篇文章主要介绍了基于OpenCV和C++ 实现图片旋转,帮助大家更好的利用c++处理图片,感兴趣的朋友可以了解下
    2020-12-12
  • C++ 利用硬件加速矩阵乘法的实现

    C++ 利用硬件加速矩阵乘法的实现

    这篇文章主要介绍了C++ 利用硬件加速矩阵乘法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • Visual C++中Tab View的多种实现方法

    Visual C++中Tab View的多种实现方法

    这篇文章主要介绍了Visual C++中Tab View的多种实现方法,包括了CTabCtrl控件、CSheetCtrl标签选择窗口以及静态分割窗口等实现Tab View的方法,需要的朋友可以参考下
    2014-10-10
  • VS报错C1189及MSB3721解决方法

    VS报错C1189及MSB3721解决方法

    在使用VS进行CUDA编译时出现错误,本文主要介绍了VS报错C1189及MSB3721解决方法,具有一定的参考价值,感兴趣的可以了解一下
    2024-06-06
  • C语言中如何实现桶排序

    C语言中如何实现桶排序

    这篇文章主要介绍了C语言中如何实现桶排序问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • C语言中互斥锁与自旋锁及原子操作使用浅析

    C语言中互斥锁与自旋锁及原子操作使用浅析

    今天不整GO语言,我们来分享一下以前写的C语言代码,来看看互斥锁、自旋锁和原子操作的demo,示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值
    2023-01-01
  • MinGW-w64 C/C++编译器下载和安装的方法步骤(入门教程)

    MinGW-w64 C/C++编译器下载和安装的方法步骤(入门教程)

    如果电脑没有安装MinGW-w64 C/C++编译器,就无法运行gcc命令,本文主要介绍了MinGW-w64 C/C++编译器下载和安装的方法步骤,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • C语言 OpenCV实现柱面投影

    C语言 OpenCV实现柱面投影

    在做全景拼接的时候,为了保持图片中的空间约束与视觉的一致性,需要进行柱面投影,否则离中心图像距离越远的图像拼接后变形越大。本文将具体介绍一下这如何实现,需要的可以参考一下
    2021-12-12
  • C++浅析程序中内存的分布

    C++浅析程序中内存的分布

    这篇文章主要介绍了C++内存分布及用法,从内存的基础概念到内存分配进行了讲解,内存是我们开发中最重要的一部分,往往逻辑上的错误就会造成内存泄漏,导致程序无法运行,下面我们就来了解文章对该内容的详细介绍
    2022-08-08

最新评论