c++11-lambda表达式,包装器function,bind

news2024/11/15 11:31:03

lambda表达式

lambda表达式在很多语言都是有的,c++当然是有的,但是像C语言就没有这个。和很多语言相同c++的lambda表达式都是为了简化代码,当我们需要传函数的时候我们就可以用lambda表达式写一个匿名函数。

书写格式:

[capture-list] : 捕捉列表,该列表总是出现在lambda函数的开始位置,编译器根据[]来判断接下来的代码是否为lambda函数,捕捉列表能够捕捉上下文中的变量供lambda函数使用。

(parameters):参数列表。与普通函数的参数列表一致,如果不需要参数传递,则可以连同()一起省略。

mutable:默认情况下,lambda函数总是一个const函数,mutable可以取消其常量性。使用该修饰符时,参数列表不可省略(即使参数为空)。

->returntype:返回值类型。用追踪返回类型形式声明函数的返回值类型,没有返回值时此部分可省略。返回值类型明确情况下,也可省略,由编译器对返回类型进行推导。

{statement}:函数体。在该函数体内,除了可以使用其参数外,还可以使用所有捕获到的变量。

这里没加mutable。一般用auto来接收这个函数。


比如我们需要来一个对于自定义类型的排序。我们 不需要再去写对应的仿函数了,直接传一个lambda表达式就行了。

class student
{
    string name ;
    int score;
public:
    student(const string& n , int sc )
    {
        name = n;
        score = sc;
    }
    int getscore()
    {
        return score;
    }
};

void test2()
{

    vector<student> ve={ student("ldaoda",124),student("爱困",123),student("蒙lei" ,100) };
    sort(ve.begin(), ve.end(), [](student x, student y)->bool {return x.getscore() > y.getscore(); });

    for (auto& e : ve)
    {
        cout << e.getscore() << " ";
    }

}

其实lambda的底层其实跟仿函数类似的。传入的参数就是进行构造。后面的返回值和函数内容就是去实现一个仿函数。
 

function包装器
 

function包装器 也叫作适配器。C++中的function本质是一个类模板,也是一个包装器。功能就是将函数包装起来。

int f(int a, int b)
{
    return a + b;
}
struct Functor
{
public:
    int operator() (int a, int b)
    {
        return a + b;
    }
};
class Plus
{
public:
    static int plusi(int a, int b)
    {
        return a + b;
    }
    double plusd(double a, double b)
    {
        return a + b;
    }
};


void  test3()
{
    // 函数名(函数指针)
    std::function<int(int, int)> func1 = f;
    cout << func1(1, 2) << endl;
    // 函数对象
    std::function<int(int, int)> func2 = Functor();
    cout << func2(1, 2) << endl;
    // lamber表达式
    std::function<int(int, int)> func3 = [](const int a, const int b)
        {return a + b; };
    cout << func3(1, 2) << endl;
    // 类的成员函数
    std::function<int(int, int)> func4 = &Plus::plusi;
    cout << func4(1, 2) << endl;
    //因为非静态成员函数需要生成对象才能取。所以需要搞个匿名对象取一个this指针。
    std::function<double(Plus, double, double)> func5 = &Plus::plusd;
    cout << func5(Plus(), 1.1, 2.2) << endl;
}

bind包装器


std::bind函数定义在头文件中,是一个函数模板,它就像一个函数包装器(适配器),接受一个可
调用对象(callable object),生成一个新的可调用对象来“适应”原对象的参数列表。一般而
言,我们用它可以把一个原本接收N个参数的函数fn,通过绑定一些参数,返回一个接收M个(M
可以大于N,但这么做没什么意义)参数的新函数。同时,使用std::bind函数还可以实现参数顺
序调整等操作。
 

给个简单的栗子:

int sub(int x, int y)
{
    return x - y;
}

using std::placeholders:: _1;//展开头文件_1表示第一个参数,_2表示第二个参数,以此类推。
using std::placeholders:: _2;
using std::placeholders:: _3;


void test4()
{
    auto s = bind(sub, 100, _1);//生成一个新函数,第一x参数传默认值,第二个参数传我们给的值
    cout << s(2);               //这里对参数的顺序的定义是从第一个没有被占用的值开始计算。
}

这里的auto其实就是替换的function。


绑定成员函数:


class Sub
{
public:
    int sub(int a, int b)
    {
        return a - b;
    }
};

void test4()
{
    
    Sub s1;
    function<int(int, int)> func1=bind(&Sub::sub,s1,_1,_2);
    cout<<func1(1,2);
}

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

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

相关文章

【Log4j2】代码执行漏洞复现!

执行以下命令 启动命令 systemctl start dockercd vulhub/log4j/CVE-2021-44228docker-compose up -d # 访问网址 http://192.168.3.42&#xff1a;xxxx/solr/#/ 启动靶场环境并在浏览器访问!!! 先在自己搭建的DNSLOG平台上获取一个域名来监控我们注入的效果. 可以发现 /solr…

人工智能:所有144本SCI期刊都在这里(20本Top,4本On Hold)

本周投稿推荐 SCI&EI • 4区“水刊”&#xff0c;纯正刊&#xff08;来稿即录&#xff09; • CCF-B类&#xff0c;IEEE一区-Top&#xff08;3天初审&#xff09; EI • 各领域沾边均可&#xff08;2天录用&#xff09; 知网&#xff08;CNKI&#xff09;、谷歌学术 …

CS61C | lecture5

CS61C | lecture5 浮点数的表示 用一个小数点作为边界分隔整数部分和小数部分。 10.101 0 2 1 2 1 1 2 − 1 1 2 − 3 2.62 5 10 10.1010_{2}1\times2^11\times2^{-1}1\times2^{-3}2.625_{10} 10.10102​12112−112−32.62510​ Scientific Notation(Binary) 单精度…

.JPG图片,各种压缩率下的文件尺寸

测试结果 不改变图片幅面的情况下&#xff0c;cv2 jpg压缩算法&#xff1a; 默认quality是9550时&#xff0c;相应的图片尺寸是95的1/3 可用。25时&#xff0c;图片尺寸是1/4&#xff0c;仍可用。 2024/07/31 16:31 85,305 out_10.jpg 2024/07/31 16:31 …

不要怕,手把手带你做好小程序关键词优化

要想让小程序在众多同类中脱颖而出&#xff0c;吸引更多的用户&#xff0c;就必须进行有效的关键词优化。优化小程序关键词是提升小程序搜索排名和吸引目标用户的重要手段。以下是一些优化小程序关键词的具体步骤和策略&#xff1a; 一、关键词研究与选择 1.了解用户搜索习惯…

文件解析漏洞

IIS解析漏洞 在windows Server 2003安装iis 1.IIS6.X 1.1 目录解析 在网站下建立文件夹的名字为 .asp/.asa 的文件夹&#xff0c;其目录内的任何扩展名的文件都被IIS当作asp文件来解析并执行。 先创建一个1.asp文件夹 再创建一个1.txt 里面写 <%now()%> 2.1 畸形文件…

go test单元测试

go test Go语言中的测试依赖go test命令。 go test 命令是用来运行测试代码的工具。测试代码通常与要测试的代码放在同一个包中&#xff0c;并且测试文件通常以 _test.go 结尾。 go test命令是一个按照一定约定和组织的测试代码的驱动程序。在包目录内&#xff0c;所有以_tes…

中国星坤拨码开关系列:为电子设备控制的提供可靠连接

在电子设备日益复杂的今天&#xff0c;控制和设置的简便性成为了用户体验的关键。中国星坤推出的拨码开关以其直观的操作界面和高可靠性&#xff0c;正在引领电子设备控制的新纪元。本文将深入探讨星坤拨码开关的主要特性、应用场景及其在现代电子设备中的重要性。 直观的人机界…

连接器表面缺陷检测方案

连接器是一种用于连接电子设备或电路中不同部件之间的组件&#xff0c;通常用于传输电力、信号或数据。连接器的设计和类型各不相同&#xff0c;以适应不同设备和应用的需求。连接器用于连接电子设备之间的电线、电缆或电路板&#xff0c;实现信号传输和电力供应。连接器设计应…

教育杂志教育杂志社教育编辑部2024年第18期目录

卷首语 “浙”里启程&#xff0c;一路“黔”行 张国军; 1 特别关注 普通高中高质量发展的九大要素——以江苏省通州湾中学为例 徐新民; 4-9 专题策划 “四史”教育融入初中历史教育教学活动探索 陈清波; 10-12 新时代加强师德师风建设的实践与认识 吴东林; 13-…

免费获取Windows7专业版ISO镜像!附上详细安装教程

Windows7专业版系统相比家庭版功能更加完善和强大&#xff0c;支持加强的网络功能、高级备份功能、位置感知打印、加密文件系统等多项安全功能&#xff0c;还有Windows XP模式、脱机文件夹和移动中心等便捷功能&#xff0c;特别适合技术爱好者和中小企业用户安装使用。以下系统…

python之贪吃蛇

废话不多说&#xff0c;直接上代码&#xff08;确保已经安装 pygame&#xff09; import pygame import random# 基础设置 # 屏幕高度 SCREEN_HEIGHT 480 # 屏幕宽度 SCREEN_WIDTH 600 # 小方格大小 GRID_SIZE 20# 颜色设置 WHITE (255, 255, 255) BLACK (0, 0, 0) GREEN…

关于 Postman 这些你都知道吗?

Postman是接口测试工具&#xff0c;在做接口测试的时候&#xff0c;Postman相当于一个客户端&#xff0c;它可以模拟用户发起的各种http请求&#xff0c;将请求的数据发送到服务端&#xff0c;获取对应的结果&#xff0c;从而测试接口是否能够满足业务功能要求&#xff0c;很直…

# mongodb副本集,执行 rs.addArb(“172.18.30.110:27019“) 添加仲裁节点,客户端卡住,半天没有反应,解决方法

mongodb副本集&#xff0c;执行 rs.addArb(“172.18.30.110:27019”) 或者rs.add(“172.18.30.110:27019”, true) 添加仲裁节点&#xff0c;客户端卡住&#xff0c;半天没有反应&#xff0c;解决方法 1、可以退出主节点后&#xff0c;重新登录&#xff0c; # Ctrl C 或者&a…

高效学术翻译:2024五大工具助你攻克语言难题!

在学术研究领域&#xff0c;阅读和翻译外文文献是每位学者必备的基本功。然而&#xff0c;语言障碍往往成为制约学术发展的瓶颈。为了帮助广大研究人员提高学术翻译效率&#xff0c;本文将为您推荐五款实用的学术翻译工具 Foxit在线翻译&#xff1a;随时随地&#xff0c;轻松翻…

就业!——AI 带来的新职业

在人工智能时代&#xff0c;人工智能不仅改变了我们的生活方式&#xff0c;也为人类带来了许多全新的就业机会。这些新机会主要体现在以下几个方面。 1、人工智能相关技术研发与应用 算法工程师专注于设计、构建及优化多样化的算法体系&#xff0c;旨在赋能并强化人工智能系统…

STM32的内存映射机制详解

目录 前言 一、基本概念 二、内存映射的组成 三、典型布局 四、常用映射 前言 刚开始学习STM32的同学可能只知道按案例配置RAM、Flash的起始地址和容量&#xff0c;但是这个地址是怎么来的&#xff0c;可能并不清楚&#xff0c;接下来让我来给大家介绍一下STM32的内存映射…

【MySQL】表的CRUD{insert 替换 查询 运算符 语句执行顺序 排序 limit 分页 truncate截断表 去重 mysql日志 聚合函数}

文章目录 1.重要点insert -- on duplicate key update替换查询运算符语句执行顺序排序limit 分页truncate截断表去重 2.mysql日志简介3.聚合函数group by CRUD : Create(创建), Retrieve(读取)&#xff0c;Update(更新)&#xff0c;Delete&#xff08;删除&#xff09; 1.重要点…

塔子哥的环游之旅-腾讯2023笔试(codefun2000)

题目链接 塔子哥的环游之旅-腾讯2023笔试(codefun2000) 题目内容 塔子哥是一位热衷旅游的程序员。他所在的国家共有 n 个城市,编号从 1 到 n。这些城市之间有 m 条双向的交通线路,分别为飞机线路和火车线路。塔子哥起始位于编号为 1 的城市,他计划前往编号为 n 的城市进行旅游…