C++语法|bind1st和bind2nd的用法
文章目录
- What什么是?
- How什么时候用?如何用?
- bind1st和bind2nd的底层实现原理
- my_find_if分析
- myBind1st分析
What什么是?
bind1st 和bind2nd分别是一个用来绑定函数对象的第一个参数或第二个参数的适配器。它在 C++98 和 C++03 标准中很常用,但从 C++11 开始,这个功能已经被认为是过时的(deprecated),并在后续的 C++17 标准中被完全移除。
作用就是:
绑定器 + 二元函数对象 ==> 一元函数对象
他俩只能应用于二元函数对象
How什么时候用?如何用?
下叙函数的代码流程为:
定义一个模板函数showContainer来打印任意类型的容器;
随机生成一个数组;
我们对其进行排序,首先使用默认排序less;随后使用重载的sort函数,丙通过greater从大到小排序;(其中less和greater都是二元谓词)
我们现在有一个需求:
把70按顺序插入到vec容器当中 找第一个小于70的数字
很明显我们现在只需要一个一元谓词,但是greater和less都是二元谓词,这怎么办呢?使用绑定器!
绑定器的作用就是:
绑定器 + 二元函数对象 ==> 一元函数对象
//略去了头文件和命名空间的导入
//...template<typename Container>
void showContainer(Container &con) {typename Container::iterator it = con.begin();for (; it != con.end(); ++it) {cout << *it << " ";}cout << endl;
}int main () {vector<int> vec;srand(time(nullptr));for (int i = 0; i < 20; ++i) {vec.push_back(rand() % 100 + 1);}showContainer(vec);sort(vec.begin(), vec.end()); //默认递增排序showContainer(vec);//greater是一个二元函数对象,从大到小排序sort(vec.begin(), vec.end(), greater<int>());showContainer(vec);/*把70按顺序插入到vec容器当中 找第一个小于70的数字需要一个一元函数对象,也就是operator()(const T &val)greater a > bless a < b绑定器 + 二元函数对象 ==> 一元函数对象bind1st: + greater bool operator()(70, const _Tp& __y) constbind2nd: + less bool operator()(const _Tp& __x, 70) const*///auto it1 = find_if(vec.begin(), vec.end(), //bind1st(greater<int>(), 70));auto it1 = find_if(vec.begin(), vec.end(), bind2st(less<int>(), 70));if (it1 != vec.end()) {vec.insert(it1, 70);showContainer(vec);}
}
bind1st和bind2nd的底层实现原理
我们这里首先实现STL标准库中的算法find_if为my_find_if;
然后实现myBind1st
main函数结构如下:
int main () {vector<int> vec;srand(time(nullptr));for (int i = 0; i < 20; ++i) {vec.push_back(rand() % 100 + 1);}showContainer(vec);//greater是一个二元函数对象,从大到小排序sort(vec.begin(), vec.end(), greater<int>());showContainer(vec);auto it1 = my_find_if(vec.begin(), vec.end(), myBind1st(greater<int>(), 70));//auto it1 = my_find_if(vec.begin(), vec.end(), //bind2st(less<int>(), 70));if (it1 != vec.end()) {vec.insert(it1, 70);showContainer(vec);}return 0;
}
my_find_if分析
从
auto it1 = my_find_if(vec.begin(), vec.end(), myBind1st(greater<int>(), 70));
在STL标准库的find_if,可以看到返回类型是一个迭代器类型,传参是容器的开始和结束位置的迭代器,最后传入的是一个一元谓词。查找的流程就是遍历指定的范围,碰到符合条件的即返回。
template<typename Iterator, typename Compare>
Iterator my_find_if(Iterator first, Iterator last, Compare cmp) {for (; first != last; ++first) {if (cmp(*first)) { //cmp.operator() (*first)小括号运算符重载return first;}}return last;
}
myBind1st分析
首先我们要搞清楚bind1st的传参和返回值:
bind1st(greater<int>(), 70)
传入的是一个二元函数对象和具体的数值,返回值其实就是一个一元函数对象,所以我们可以模拟出:
// myBind1st(greater<int>(), 70))
template<typename Compare, typename T>
_mybind1st<Compare, T> myBind1st (Compare cmp, const T &val) {// 直接使用函数模板,好处是可以进行类型的推演return _mybind1st<Compare, T>(cmp, val);
}
我们再来实现这个_mybind1st:
template<typename Compare, typename T>
class _mybind1st { //绑定器是函数对象的一个应用
public:_mybind1st(Compare cmp, T val):_cmp(cmp), _val(val){}bool operator() (const T &second) { //重载函数调用运算符return _cmp(_val, second);}
private:Compare _cmp;T _val;
};
这样我们就可以愉快得使用啦
相关文章:
C++语法|bind1st和bind2nd的用法
文章目录 What什么是?How什么时候用?如何用?bind1st和bind2nd的底层实现原理my_find_if分析myBind1st分析 What什么是? bind1st 和bind2nd分别是一个用来绑定函数对象的第一个参数或第二个参数的适配器。它在 C98 和 C03 标准中很…...
Zabbix+Grafana-常见报错及异常处理方式记录
文章目录 Zabbix安装篇Zabbix Web页面连接数据库失败 Zabbix使用篇中文显示不全 Zabbix报警篇新建的用户,配置报警后,无法收到报警 Grafana安装篇Windows系统安装时,添加zabbix报错:An error occurred within the plugin Zabbix安…...
一键转换,MP4视频变为MP3音频,只需这一行代码!
想要将珍藏的视频配乐提取出来?想把喜欢的电影原声变成音频?现在,只需一行代码,就能轻松将MP4视频转换为MP3音频! 这篇文章将带你一步步完成转换,并详细解释每一步的操作,即使你是新手也能轻松…...
Oracle12之后json解析包怎么调用
在 Oracle 12g 及之后的版本中,Oracle 提供了对 JSON 的原生支持,使得在数据库中存储、查询和解析 JSON 数据变得更为简单。你可以使用 Oracle 提供的 SQL 函数和操作符来处理 JSON 数据。 以下是一些常用的 Oracle SQL 函数和操作符,用于解…...
wordpress子比主题美化-为图文列表封面添加动态缩略图特效 多种效果演示
wordpress子比主题-为图文列表文章封面添加动态缩略图特效 给自己子比主题加一个列表文章封面添加动态缩略图 直接复制以下代码,添加到主题自定义CSS代码中即可,下图为效果演示 wordpress子比主题-为图文列表文章封面添加动态缩略图特效 给自己子比主题…...
spring boot3多模块项目工程搭建-上(团队开发模板)
⛰️个人主页: 蒾酒 🔥系列专栏:《spring boot实战》 目录 写在前面 多模块结构优缺点 模块介绍 Common 模块: API 模块: Web 模块: Service 模块: DAO 模块: 搭建步骤 1.创建 父…...
人脸美型SDK解决方案,适用于各类应用场景
视频内容已经成为企业宣传、产品展示、互动直播等多个领域的核心载体。而在这些场景中,高质量的人脸美型效果不仅能够提升用户体验,更能为品牌加分。美摄科技凭借深厚的技术积累和行业洞察,推出了全新的人脸美型SDK解决方案,为企业…...
RS2103XH 功能和参数介绍及规格书
RS2103XH 是一款单刀双掷(SPDT)模拟开关芯片,主要用于各种模拟信号的切换和控制。下面是一些其主要的功能和参数介绍: 主要功能特点: 模拟信号切换:能够连接和断开模拟信号路径,提供灵活的信号路…...
nn.TransformerEncoderLayer详细解释,使用方法!!
nn.TransformerEncoderLayer nn.TransformerEncoderLayer 是 PyTorch 的 torch.nn 模块中提供的一个类,用于实现 Transformer 编码器的一个单独的层。Transformer 编码器层通常包括一个自注意力机制和一个前馈神经网络,中间可能还包含层归一化ÿ…...
巨控GRM561/562/563/564Q杀菌信息远程监控
摘要 通过程序编写、手机APP画面制作等运行系统,实现电脑及手机APP显示的历史曲线画面和数据图形化的实时性。 不仅流程效率提升90%以上,同时为杀菌生产提供有利的质量保障,还有效规避因触屏及内存卡的突发异常导致历史数据的丢失࿰…...
RT-DETR-20240507周更说明|更新Inner-IoU、Focal-IoU、Focaler-IoU等数十种IoU计算方式
RT-DETR改进专栏|包含主干、模块、注意力、损失函数等改进 专栏介绍 本专栏包含模块、卷积、检测头、损失等深度学习前沿改进,目前已有改进点70!每周更新。 20240507更新说明: ⭐⭐ 更新CIoU、DIoU、MDPIoU、GIoU、EIoU、SIoU、ShapeIou、PowerfulIoU、…...
Web3:下一代互联网的科技进化
随着科技的不断演进,互联网已经成为了我们生活中不可或缺的一部分。而在Web3时代,我们将会见证互联网进化的下一个阶段。本文将探讨Web3作为下一代互联网的科技进化,以及它所带来的重要变革和影响。 传统互联网的局限性 传统互联网存在诸多…...
SQL注入-基础知识
目录 前言 一,SQL注入是什么 二,SQL注入产生的条件 三,学习环境介绍 四、SQL注入原理 五,SQL中常用的函数 六,关于Mysql数据库 前言 在网络安全领域中,sql注入是一个无法被忽视的关键点,…...
npx 有什么作用跟意义?为什么要有 npx?什么场景使用?
npx 是 npm 从 v5.2.0 开始新增了 npx 命令,> 该版本会自动安装 npx,如果不能使用就手动安装一下: $ npm install -g npxnpx 的作用 npm 只能管理包的依赖,npx 则可以快捷的运用包中的命令行工具和其他可执行文件,…...
Docker搭建LNMP+Wordpress
目录 一.项目模拟 1.项目环境 2.服务器环境 3.任务需求 (1)使用 Docker 构建 LNMP 环境并运行 Wordpress 网站平台 (2)限制 Nginx 容器最多使用 500MB 的内存和 1G 的 Swap (3)限制 Mysql 容器写 /d…...
PCIE相关总结
1、概述 "PCIE 槽位" 指的是主板上的 Peripheral Component Interconnect Express (外围设备互联扩展)槽位。它是用于连接扩展卡(如显卡、网卡、声卡等)到主板的接口。PCI Express 是一种高速串行扩展总线标准ÿ…...
OpenCV 入门(五) —— 人脸识别模型训练与 Windows 下的人脸识别
OpenCV 入门系列: OpenCV 入门(一)—— OpenCV 基础 OpenCV 入门(二)—— 车牌定位 OpenCV 入门(三)—— 车牌筛选 OpenCV 入门(四)—— 车牌号识别 OpenCV 入门…...
C++基础-编程练习题2
文章目录 前言一、查找“支撑数”二、数组元素的查找三、爬楼梯四、数字交换五、找高于平均分的人 前言 C基础-编程练习题和答案 一、查找“支撑数” 【试题描述】 在已知一组整数中, 有这样一种数非常怪, 它们不在第一个, 也不在最后一个&…...
Linux下GraspNet复现流程
Linux,Ubuntu中GraspNet复现流程 文章目录 Linux,Ubuntu中GraspNet复现流程1.安装cuda和cudnn2.安装pytorch3.编译graspnetAPIReference 🚀非常重要的环境配置🚀 ubuntu 20.04cuda 11.0.1cudnn v8.9.7python 3.8.19pytorch 1.7.0…...
Linux——MySQL5.7编译安装、RPM安装、yum安装
文章目录 Linux——MySQL5.7编译安装、RPM安装、yum安装一、编译安装二、RPM安装三、yum安装 Linux——MySQL5.7编译安装、RPM安装、yum安装 卸载mysql # 查看是否安装了mysql [rootcsq ~]# rpm -qa |grep mysql mysql-community-server-5.7.36-1.el7.x86_64 mysql-community-c…...
【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...
Golang——7、包与接口详解
包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...
小木的算法日记-多叉树的递归/层序遍历
🌲 从二叉树到森林:一文彻底搞懂多叉树遍历的艺术 🚀 引言 你好,未来的算法大神! 在数据结构的世界里,“树”无疑是最核心、最迷人的概念之一。我们中的大多数人都是从 二叉树 开始入门的,它…...
消息队列系统设计与实践全解析
文章目录 🚀 消息队列系统设计与实践全解析🔍 一、消息队列选型1.1 业务场景匹配矩阵1.2 吞吐量/延迟/可靠性权衡💡 权衡决策框架 1.3 运维复杂度评估🔧 运维成本降低策略 🏗️ 二、典型架构设计2.1 分布式事务最终一致…...
ZYNQ学习记录FPGA(一)ZYNQ简介
一、知识准备 1.一些术语,缩写和概念: 1)ZYNQ全称:ZYNQ7000 All Pgrammable SoC 2)SoC:system on chips(片上系统),对比集成电路的SoB(system on board) 3)ARM:处理器…...
[特殊字符] 手撸 Redis 互斥锁那些坑
📖 手撸 Redis 互斥锁那些坑 最近搞业务遇到高并发下同一个 key 的互斥操作,想实现分布式环境下的互斥锁。于是私下顺手手撸了个基于 Redis 的简单互斥锁,也顺便跟 Redisson 的 RLock 机制对比了下,记录一波,别踩我踩过…...
