C++11(4)

万众瞩目的C++11特辑来了,本章将继续讲解C++11更新的内容,不过C++11的内容也快接近尾声了。

目录

10。lambda表达式

11。lambda捕捉列表[]

捕捉列表说明

lambda捕捉列表实际应用


10。lambda表达式

#include<iostream>
using namespace std;
#include<algorithm>
#include<vector>
struct Goods
{
    string _name; // 名字
    double _price; // 价格
    int _evaluate; // 评价
    //...

    Goods(const char* str, double price, int evaluate)
        :_name(str)
        , _price(price)
        , _evaluate(evaluate)
    {}
};

int main()
{
    //lambda表达式
    // lambda 匿名函数的对象, 所以肯定有类型,所以肯定有返回值
    //即返回一个lambda类型的对象

    auto ret = [](int x, int y)->int {return x + y; };
    //为什么用auto自动推导呢,因为lambda的类型lambda_uuid过于复杂了,详情请看汇编
    //这个切记lambda的返回值不是返回函数体里面运算得出了类型,虽然return了
    cout << ret(1, 1) << endl;
    cout << ret(3, 1) << endl;
    //上面展示的是lambda表达式的完整形式
    //最前面的捕捉列表,没有捕捉对象可以没有任何东西,但是[]必须写上
    //后面的参数部分,确实不需要传参可以不写,明确函数体返回值的可以不写->返回值
    //函数体部分不可以省略
    //所以只有[]和函数体是必须写上的

    // 返回值类型可自动推导类型,所以可以省略
    // 无参数可以省略

    auto it = []
        {
            cout << "wfwfwq" << endl;
            cout << "wfwfwq" << endl;
            cout << "wfwfwq" << endl;
            cout << "wfwfwq" << endl;
            //return 0;//有没有return都无所谓的,只要返回值确定或者无返回值
        };
    it();//外部调用方法
    return 0;
}

//通过观察底层汇编可以发现lambda和仿函数的实现有点像,
//所以这两个是可以互相替代使用的

然而我们会发现,在之前使用的库里面的sort函数就使用了仿函数,所以我们可以使用lambda表达式对其进行改造。
struct comp1//比较价格的升序
{
    bool operator()(const Goods& gl, const Goods& gr)
    {
        return gl._price < gr._price;
    }
};

struct comp2//比较价格的降序
{
    bool operator()(const Goods& gl, const Goods& gr)
    {
        return gl._price > gr._price;
    }
};
int main()
{
    vector<Goods> v = { { "苹果", 2.1, 5 }, { "香蕉", 3, 4 }, { "橙子", 2.2, 3 }, { "菠萝", 1.5, 4 } };
    sort(v.begin(), v.end(), comp1());
    sort(v.begin(), v.end(), [](const Goods& gl, const Goods& gr) 
        {
            return gl._price > gr._price;
        });
    return 0;
}

以下为调试结果:

//使用lambda表达式的优点是便于使用者马上就可以看出在进行什么操作,升序排列降序排列什么的
//比较直观
//其实也不需要去看底层这个comp1作为一个类,comp1()就是匿名函数对象,那和lambda的本质不是一样了吗

11。lambda捕捉列表[]

//接着聊一下捕捉列表是个什么东西,有什么作用

//捕捉列表的本质就是在初始化函数的参数!!!
int main()
{
    int a = 2;
    int b = 5;
    auto swap1 = [](int& x, int& y)
        {
            //只能用当前lambda局部域和捕捉的对象
            int temp = x;
            x = y;
            y = temp;
        };
    swap1(a, b);
    cout << a << endl;
    cout << b << endl;
    int c = 6;
    int d = 7;
    //发现swap1将两个值交换了
    auto swap2 = [c, d]()mutable
        {
            // 只能用当前lambda局部域和捕捉的对象
            int temp = c;
            c = d;
            d = temp;
            //上面报错的信息为必须是可修改的左值
            //说明传值捕捉指定参数个体本质是一种拷贝,并且const修饰了
            //解决办法在[]后面加上()mutable,mutable的作用是去除const属性

        };
    swap2();//传值捕捉还是需要调用的,只是参数固定了,不需要写了(不要忘了调用)
    cout << c << endl;
    cout << d << endl;
    //发现没有交换成功, 结合上面swap1交换成功的例子可以看出传值捕捉
    //修改了不会影响外面被捕捉的值,因为是一种拷贝,如果执意要改需要传引用捕捉
    //这里侧面体现了mutable和传值捕捉都没有什么实际价值

    auto swap3 = [&c, &d]//这里不是取地址是引用
        {
            int tmp = c;
            c = d;
            d = tmp;
        };
    swap3();
    cout << c << endl;
    cout << d << endl;

    return 0;
}

// 只能用当前lambda局部域和捕捉的对象和全局对象

捕捉列表说明

int main()
{
    //还有其他的捕捉方式
    int a = 0;
    int b = 1, c = 1;
    int d = 2;
    // 所有值传值捕捉
    auto func1 = [=]
        {
            int ret = a + b + c + d;
            return ret;//如果要取到ret的值就需要返回,因为出了func1函数的局部域就销毁了
        };
    // 所有值传引用捕捉
    auto func2 = [&]
        {
            a++;
            b++;
            c++;
            d++;
            int ret = a + b + c + d;
            return ret;//如果要取到ret的值就需要返回,因为出了func1函数的局部域就销毁了
        };
    // 混合捕捉
    auto func3 = [&a, b]
        {
            a++;
            //b++;//无法修改
            int ret = a + b;
            return ret;//如果要取到ret的值就需要返回,因为出了func1函数的局部域就销毁了
        };
    // 混合捕捉
    // 除d以外所有值以引用方式捕捉,d用传值捕捉

    auto func4 = [&, d]
        {
            a++;
            b++;
            c++;
            //d++;
            int ret = a + b + c + d;
            return ret;//如果要取到ret的值就需要返回,因为出了func1函数的局部域就销毁了
        };
    // 除d以外所有值以传值方式捕捉,d用传引用捕捉
    auto func5 = [=, &d]() mutable
            {
                a++;
                b++;
                c++;
                d++;
                int ret = a + b + c + d;
            };
    int p1 = func1();
    int p2 = func2();
    int p3 = func3();
    int p4 = func4();
    cout << p1 << endl;
    return 0;
    //太多组合方式了

}

lambda捕捉列表实际应用

下面的例子是一个计算利息的程序(后面会不断的使用这个例子)

class Rate
{
public:
    Rate(double rate) 
        : _rate(rate)
//一般是放在下面
    {}

    double operator()(double money, int year)
    {
        return money * _rate * year;
//计算当年的利息
    }
private:
    double _rate;
};

int main()
{
  
 // 函数对象
    double rate = 0.015;
    Rate r1(rate);
    cout << r1(10000, 2) << endl;

    // lambda[]捕捉在全局域捕捉
    auto r2 = [rate](double monty, int year)->double
    {
        return monty * rate * year;
    };

    cout << r2(10000, 2) << endl;

    int x = 1, y = 2;
  
 //执行之后发现捕捉列表也不是什么都捕捉的,对函数体里面有用的变量才捕捉
    auto r3 = [=](double monty, int year)->double
    {
        return monty * rate * year;
    };

    cout << r3(10000, 2) << endl;


    return 0;
}

现在解决一下关于lambda对象的类型的问题:请看下图

可以看到图片//lambda那里有一个call   <lambda_什么什么>很长的一串字符,这个就是lambda对象的类型,这个可以看成是一个类(因为有类操作符::),类就是类型,由于太长了就简称lambda_uuid,所有lambda是有类型的并且可以取到的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/142993.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

安装WINDOWS微软商店已下架的WSL系统,以UBUNTU 16.04 为例

下载WSL系统 方法1&#xff1a;POWERSHELL 用powershell下载 PowerShell Invoke-WebRequest -Uri https://aka.ms/wsl-ubuntu-1604 -OutFile Ubuntu.appx -UseBasicParsing 1 如果下载时间很长&#xff0c;可以这样把进度条关闭&#xff1a; $ProgressPreference Silentl…

iKuai使用及设置流程

iKuai使用及设置流程 iKuai安装步骤 一、配置主机 1.电脑连接ETH0网口 2.ETH1网口连接猫上面的千兆口 3.手动配置pc的IP地址和192.168.1.1./24在同一网段 3.浏览器输入192.168.1.1 admin admin 二、外网设置 1.直接联通电信网络设置 2.点击 网络设置-内外网设置-点击接…

【网络安全】逻辑漏洞之购买商品

未经授权,不得转载。 文章目录 正文正文 电子商务平台的核心功能,即购买商品功能。因为在这个场景下,任何功能错误都有可能对平台产生重大影响,特别是与商品价格和数量有关的问题。 将商品添加到购物车时拦截请求: 请求包的参数: 解码参数后,并没有发现价格相关的参数,…

IDC JAVA语言搭建教程

程序搭建环境&#xff1a;Linux系统CentOS7.6、宝塔、PHP7.2、MySQL5.6&#xff0c;根目录public&#xff0c;伪静态thinkPHP&#xff0c;开启SSL 安装&#xff1a; yum -y install build-essential QQ1594457675 安装&#xff1a;更多依赖包 yum -y install gcc automake …

java编程行业特点

Java编程行业是一个庞大且充满活力的领域&#xff0c;它涵盖了从桌面应用到企业级应用、从Web开发到移动应用、从大数据处理到云计算服务的广泛范围。Java作为一种跨平台、面向对象的编程语言&#xff0c;自1995年发布以来&#xff0c;一直受到全球开发者的青睐&#xff0c;并在…

【网络安全】Google Dorks+Wayback Machine实现敏感数据泄露

未经许可,不得转载。 文章目录 正文正文 Dork搜索: site: privateprogram.com/webapp/经后续挖掘,我发现了一个专门用于存储用户订单的子域和其中一条链接: https://orders.privateprogram.com/webapp/wcs/stores/servlet/OrderView?orderId=002233893但是访问后返回错…

Qt优秀开源项目之二十三:QSimpleUpdater

QSimpleUpdater是开源的自动升级模块&#xff0c;用于检测、下载和安装更新。 github地址&#xff1a;https://github.com/alex-spataru/QSimpleUpdater QSimpleUpdater目前Star不多&#xff08;911个&#xff09;&#xff0c;但已在很多开源项目看到其身影&#xff0c;比如Not…

关于 Regshot 软件

https://github.com/skydive241/Regshot-Advanced#Regshot 3.0.0 1 1.9 版本很多配置没有界面&#xff0c;3.0 把它们都展示到界面上。 2 生成 .au3 好像只能用于安装或卸载软件 3 对于手动修改注册表&#xff0c;会输出 .reg 和 .cmd 等。 对于软件安装&#xff0c;输出有异…

markdown 使用技巧

文章目录 markdown使用技巧1.标题快捷键设置2.文档可读性设置 markdown使用技巧 1.标题快捷键设置 ctl 1:一级标题 ctl 2:二级标题 ctl 3:三级标题 ctl 4:四级标题 ...2.文档可读性设置 输入~~~pro 可选择代码框&#xff0c;并且可以选择不同的字体 ctrl shift ] : 可…

实时数仓3.0DWD层

实时数仓3.0DWD层 DWD层设计要点&#xff1a;9.1 流量域未经加工的事务事实表9.1.1 主要任务9.1.2 思路9.1.3 图解9.1.4 代码 9.2 流量域独立访客事务事实表9.2.1 主要任务9.2.2 思路分析9.2.3 图解9.2.4 代码 9.3 流量域用户跳出事务事实表9.3.1 主要任务9.3.2 思路分析9.3.3 …

uniapp uview扩展u-picker支持日历期间 年期间 月期间 时分期间组件

uniapp uview扩展u-picker支持日历期间 年期间 月期间 时分期间组件 日历期间、年期间、月期间及时分期间组件在不同的应用场景中发挥着重要的作用。这些组件通常用于表单、应用程序或网站中&#xff0c;以方便用户输入和选择特定的日期和时间范围。以下是这些组件的主要作用&a…

CAD图纸加密软件哪个好?10款2024主流CAD图纸加密软件分享!

随着信息安全意识的增强&#xff0c;特别是在工程设计、建筑和制造等领域&#xff0c;保护CAD图纸的安全成为一项重要任务。选择合适的CAD图纸加密软件不仅能确保数据安全&#xff0c;还能提高企业的合规性。以下是2024年主流的10款CAD图纸加密软件&#xff0c;每款软件均有独特…

Vue学习记录之三(ref全家桶)

ref、reactive是在 setup() 声明组件内部状态用的&#xff0c; 这些变量通常都要 return 出去&#xff0c;除了供 < template > 或渲染函数渲染视图&#xff0c;也可以作为 props 或 emit 参数 在组件间传递。它们的值变更可触发页面渲染。 ref &#xff1a;是一个函数&…

ROS组合导航笔记3:GPS导航

GPS 基础概念 GPS 数据有一些限制&#xff1a; GPS 数据不是非常精确&#xff1a;GPS 数据的值会波动&#xff0c;你的位置会经常移动。这是不可避免的&#xff0c;你需要以自己的方式减轻这种误差。里程计数据会减少一些这些误差&#xff0c;但不是全部&#xff0c;因为 Summi…

电脑右击没有txt文件

文本文档是一个好工具&#xff0c;小而快&#xff0c;比word快多&#xff0c;一般情况下&#xff0c;记录都会先用txt文本&#xff0c;但是今天发现右击菜单新建里面没有&#xff0c;怎么回事&#xff1f; 这个需要打开注册编辑表修改 一、打开注册编辑表 win R 输入regedi…

基于EchoMimic加速版,可编辑标志点控制实现逼真音频驱动的肖像动画

EchoMimic 是蚂蚁集团终端技术部门开发的一项技术,旨在通过音频驱动生成逼真的肖像动画。对于那些初次接触这项技术的用户,本教程将带你逐步了解如何设置开发环境、获取项目代码、安装依赖,并最终成功运行示例生成自己的肖像动画。 文章目录 项目代码安装依赖业务拓展参数调…

Python中的元类:掌握类的创建与定制

在面向对象编程中&#xff0c;类是组织代码的重要手段。但在Python中&#xff0c;类本身也是对象&#xff0c;这意味着它们可以被创建、修改甚至定制。元类&#xff08;Metaclass&#xff09;是Python中的一种高级特性&#xff0c;它允许你在类被创建时对其进行修改或增强。本文…

面向对象程序设计(C++)———多态

1.认识多态 多态(polymorphism)的概念&#xff1a;通俗来说&#xff0c;就是多种形态。多态分为编译时多态(静态多态)和运⾏时多态(动态多态)&#xff0c;这⾥我们重点讲运⾏时多态&#xff0c;编译时多态(静态多态)和运⾏时多态(动态多态)。编译时 多态(静态多态)主要就是我们…

WinForms 的支持跨域的测试程序

WinForms 的支持跨域的测试程序 using System; using System.Diagnostics; using System.IO; using System.Net; using System.Text; using System.Text.RegularExpressions; using System.Threading; using System.Windows.Forms;namespace SimpleHttpServer_cors {public par…

Linux进阶命令-awkuniq

作者介绍&#xff1a;简历上没有一个精通的运维工程师。希望大家多多关注作者&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 经过上一章Linux日志的讲解&#xff0c;我们对Linux系统自带的日志服务已经有了一些了解。我们接下来将讲解一些进阶命令&am…