C++11 lambda表达式、包装器、Bind绑定

Hello!大家早上中午晚上好!!今天来复习C++11三个新加的特性!!

一、lambda 表达式

1.1什么是lambda表达式?

语法:[捕捉列表](参数列表)->返回值{函数体};

捕捉列表:捕捉上下文的变量供lambda函数使用可省略;

参数列表:与普通函数的参数列表一样,如果没有可省略;

->:可省略;

返回值:如果为空或已确定返回类型,可省略;

函数体:如果没有要写的也可省略;

最简洁的lambda表达式: []{};

1.2 写一lambda表达式用来比较两个数的大小:
int main()
{int x = 10;int y = 20;auto f1 = [](int x, int y)->bool {return x > y; };cout << f1(x, y) << endl;cout << f1(y, x) << endl;return 0;
}

lambda表达式相当于一个局部的匿名函数对象

1.3lambda表达式的作用

lambda表达式与仿函数比较:

class foods
{
public:foods(int price,const char*name,int id):_price(price),_name(name),_id(id){}int _price;//价格const char* _name;//名字int _id;//编号
};struct priceLess
{bool operator()(foods& f1, foods& f2){return f1._price < f2._price;}
};
struct priceGreater
{bool operator()(foods&f1,foods&f2){return f1._price > f2._price;}
};
int main()
{foods rice(10, "米饭", 101);foods chicken(20, "鸡肉", 102);foods fish(30, "鱼",103);//使用仿函数//比较谁价格更低priceLess less;cout << less(rice, chicken) << endl; //比较谁价格高priceGreater great;cout << great(rice, fish) << endl;//使用lambda表达式auto f1 = [](foods&f1,foods&f2)->bool {return f1._price < f2._price;};cout << f1(rice, chicken) << endl;auto f2 = [](foods& f1, foods& f2)->bool {return f1._price > f2._price; };cout << f2(rice, fish) << endl;return 0;
}

lambda表达式使用起来更简洁方便灵活,仿函数的定义写的太死板,且代码太繁琐;假设要比较foods类的id又要定义一个比较id的类,假设要比较foods类的name,又要定义一个比较name的类;而lambda表达式直接写就行;

1.4lambda表达式的实现原理

实际在底层编译器对于lambda表达式的处理方式,完全就是按照函数对象的方式处理的,即:如 果定义了一个lambda表达式,编译器会自动生成一个类,在该类中重载了operator()

二、包装器

2.1什么是包装器?

包装器是函数适配器,用来包装可调用对象,包装器实质是一个模版:

包装器的头文件: <functional>

其中Ret是返回类型,Args...是可变参数;

2.2包装器的使用

一个简单的包装器使用:

#include<functional>
//函数指针
int fun1(int x, int y)
{return x + y;
}
//仿函数
class fun2
{
public:double operator()(double x, double y){return x + y;}
};
//类
class A
{
public:int add(int x, int y)//非静态成员函数{return x * y;}static void print()//静态成员函数{cout << "我是一个类成员静态函数" << endl;}
};
int main()
{//包装一个函数指针function<int(int, int)> func1 = fun1;cout << fun1(3, 3) << endl;//包装一个仿函数function<double(double, double)> func2 = fun2();cout << func2(3.3, 4.4) << endl;//包装一个非静态成员函数 function<int(A, int, int)> func3 = &A::add;cout << func3(A(), 4, 4) << endl;//包装一个静态成员函数function<void()> func4 = &A::print;func4();//包装一个lambda表达式function<string(int)> func5 = [](int x)->string {string s1 = "你好"; s1 += x; return s1; };cout << func5(88) << endl;return 0;
}

注意:非静态类型成员函数必须取地址,静态成员函数可以不取地址

2.3包装器的作用

包装器的作用就是用来包装可调用对象并统一可调用对象的类型,方便管理!

理解:

使用包装器后:

只要返回类型,参数列表类型一样,包装器可以把所有可调用对象的类型统一!方便管理!!

三、bind绑定

3.1原形

可以将bind函数看作是一个通用的函数适配器,它接受一个可调用对象,生成一个新的可调用对 象来“适应”原对象的参数列表。

3.2使用
int Sub(int x, int y)
{return x - y;
}
int main()
{//绑定第一个参数传_1,第二个参数传_2(与原形一样)function<int(int, int)> func1 = bind(Sub, placeholders:: _1, placeholders:: _2);cout << func1(3, 5) << endl;//绑定第一个参数传_1,第二个参数传_2 (交换位置)function<int(int, int)>func2 = bind(Sub, placeholders::_2, placeholders::_1);cout << func2(3, 5) << endl;//绑定第一个参数为5,第二个参数为6function<int(int, int)>func3 = bind(Sub, 5,6);cout << func3(3,5) << endl;return 0;
}

好了,今天就到这里!!如果您就觉得有所收获记得点赞收藏+关注哦!!谢谢!!!

咱下期见!!!

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络:(二)计算机网络在我国发展与网络类别与性能 (附带图谱更好对比理解)

计算机网络&#xff1a;&#xff08;二&#xff09;计算机网络在我国发展与网络类别和性能 前言一、计算机网络在我国的发展二、计算机网络的类别1. 计算机网络的定义2. 不同类别的计算机网络&#xff08;1&#xff09;按覆盖范围分类&#xff08;2&#xff09;按传输技术分类…

CoreData 调试警告:多个 NSEntityDescriptions 声明冲突的解决

概述 目前在苹果生态 App 的开发中&#xff0c;CoreData 数据库仍然是大部分中小应用的优先之选。不过&#xff0c;运行时 CoreData 常常产生各种“絮絮叨叨”的警告不禁让初学的秃头小码农们云里雾里。 这不&#xff0c;对于下面这一大段 CoreData 警告&#xff0c;大家是否一…

解决QT_Debug 调试信息不输出问题

方式1 &#xff1a;手动通过添加环境变量解决 ->使用命令&#xff1a; QT_LOGGING_TO_CONSOLE1 qtcreator启动 ->如若还未输出qDebug调试信息 则在程序中引<QLoggingCategory>包 #include <QLoggingCategory> ->在程序入口添加 QLoggingCategory::defa…

【CF】Day9——Codeforces Round 953 (Div. 2) BCD

B. New Bakery 题目&#xff1a; 思路&#xff1a; 被标签害了&#xff0c;用什么二分&#xff08; 很简单的思维题&#xff0c;首先如果a > b&#xff0c;那么全选a就行了&#xff0c;还搞啥活动 否则就选 b - a 天来搞活动&#xff0c;为什么&#xff1f; 首先如果我…

[MAVEN][经验总结]MAVEN_HOME和M2_HOME的配置建议

前言 MAVEN_HOME和M2_HOME都是maven的环境变量&#xff0c;要配置哪个&#xff0c;与maven版本有关&#xff0c;我在实操过程中遇到相关的问题&#xff0c;现记录如下。 MAVEN_HOME和M2_HOME的区别 MAVEN_HOME 和 M2_HOME 本质上是同一个作用的环境变量&#xff0c;它们的区…

力扣Hot100——169. 多数元素

解法1&#xff1a;使用HashMap 将nums数组映射到HashMap中&#xff0c;键为nums的值&#xff0c;值为nums中值的数量&#xff1b; 然后遍历哈希表&#xff0c;返回值最大的键 class Solution {private Map<Integer, Integer> countNums(int[] nums) {Map<Integer, Int…

EasyRTC嵌入式音视频通话SDK:微信生态支持、轻量化架构与跨平台兼容性(Linix/Windows/ARM/Android/iOS/LiteOS)

随着WebRTC技术的不断发展&#xff0c;实时音视频通信在各个领域的应用越来越广泛。EasyRTC嵌入式音视频通话SDK作为一款基于WebRTC技术的实时通信解决方案&#xff0c;凭借其强大的功能和灵活的集成能力&#xff0c;受到了越来越多开发者的关注。 一、系统架构设计 纯C语言开…

QuickAPI:一键将 Excel 数据转为数据库表

在开发和数据管理中&#xff0c;将 Excel 数据快速导入数据库是一项常见需求&#xff0c;但手动建表和导入的过程往往让人头疼。 QuickAPI 作为一款高效的统一数据服务平台&#xff0c;提供了一键将 Excel 数据转为数据库表的功能&#xff0c;极大简化了操作流程。本文将以技术…

【MySQL】多表查询(笛卡尔积现象,联合查询、内连接、左外连接、右外连接、子查询)-通过练习快速掌握法

在DQL的基础查询中&#xff0c;我们已经学过了多表查询的一种&#xff1a;联合查询&#xff08;union&#xff09;。本文我们将系统的讲解多表查询。 笛卡尔积现象 首先&#xff0c;我们想要查询emp表和stu表两个表&#xff0c;按照我们之前的知识栈&#xff0c;我们直接使用…

JavaScript如何做类型转换

一、类型转换 二、补充 console.log(1 "2" "2"); // 122 console.log(1 "2" "2"); // 32 console.log(1 -"1" "2"); // 02 console.log("1" "1" "2"); // 112 consol…

华为中小型企业项目案例

实验目的(1) 熟悉华为交换机和路由器的应用场景 (2) 掌握华为交换机和路由器的配置方法 实验拓扑实验拓扑如图所示。 华为中小型企业项目案例拓扑图 实验配置市场部和技术部的配置创建VLANLSW1的配置 [LSW1]vlan batch 10 20 [LSW1]q…

【PyTorch][chapter-35][MLA]

前言&#xff1a; MLA&#xff08;Multi-head Latent Attention&#xff0c;多头潜在注意力&#xff09;旨在提高推理效率和降低计算资源的消。MLA的核心思想在于通过信息转移来优化KV缓存的使用 MLA的技术特点主要包括&#xff1a; KV压缩与潜在变量&#xff1a;将键&#xff…

Spring Cloud 中的服务注册与发现: Eureka详解

1. 背景 1.1 问题描述 我们如果通过 RestTamplate 进行远程调用时&#xff0c;URL 是写死的&#xff0c;例如&#xff1a; String url "http://127.0.0.1:9090/product/" orderInfo.getProductId(); 当机器更换或者新增机器时&#xff0c;这个 URL 就需要相应地变…

微服务存在的问题及解决方案

微服务存在的问题及解决方案 1. 存在问题 1.1 接口拖慢 因为一个接口在并发时&#xff0c;正好执行时长又比较长&#xff0c;那么当前这个接口占用过多的 Tomcat 连接&#xff0c;导致其他接口无法即时获取到 Tomcat 连接来完成请求&#xff0c;导致接口拖慢&#xff0c;甚至…

centos 安装pip时报错 Cannot find a valid baseurl for repo: centos-sclo-rh/x86_64

centos 安装pip时报错 [rootindex-es app-ai]# yum update Loaded plugins: fastestmirror Repository centos-sclo-rh is listed more than once in the configuration Determining fastest mirrors Could not retrieve mirrorlist http://mirrorlist.centos.org?archx86_64…

解决图片转 ICO 图标难题,支持批量处理

还在为图片转 ICO 图标发愁吗&#xff1f;别担心&#xff0c;今天为大家带来一款超实用的工具 ——Any to Icon。它功能强大&#xff0c;可实现批量图片转 ICO 图标&#xff0c;轻松解决格式转换难题。更棒的是&#xff0c;这款工具极为小巧&#xff0c;无需安装&#xff0c;即…

MultiPost--多平台博客发布工具

网站介绍 一键发布内容到多个社交平台的浏览器插件&#xff0c;支持知乎、微博、小红书、抖音等主流平台&#xff0c;支持文字、图片、视频等内容形式. 地址 GitHub &#xff1a; https://github.com/leaper-one/MultiPost-Extension Chorme: https://chromewebstore.google.…

Linux进程状态详解:僵尸进程与孤儿进程的深度探索与实践

文章目录 前言一、进程状态概述1.1 运行状态1.2 阻塞状态1.3 挂起状态 二、具体的Linux操作系统中的进程状态2.1 Linux内核源代码2.2 查看进程状态2.3 D磁盘休眠状态(Disk sleep)D状态的定义&#xff1a; 2.4 T停止状态(stopped)停止状态的概述&#xff1a;停止状态的触发条件&…

【Linux】深入理解进程和文件及内存管理

个人主页~ 深入理解进程和文件及内存管理 一、重谈Linux下一切皆文件二、操作系统对物理内存的管理1、物理内存与磁盘的数据交互2、操作系统对物理内存的管理 三、文件页缓冲区向文件写入数据的过程 四、动态库是如何被加载的关于动态库中的全局变量 五、深入理解地址1、程序地…

★9.4.2 context2D 绘图

返回目录&#xff1a; Qt QML专栏目录结构_qml 项目 目录-CSDN博客 ★9.4.2 context2D 绘图 Object <- context 属性 canvas : QtQuick::Canvas fillRule : enumeration fillStyle : variant fillStyle: 设置或获取当前填充颜色或样式。 font : string g…