C++_24_适配器

A 函数对象

概念:

​ 重载函数调用运算符的类实例化的对象,就叫函数对象.又名仿函数,函数对象和()触发重载函数调用运算符的执行。

作用:

​ 为算法提供策略

示例:

#include <iostream>
using namespace std;
class MyClass
{
public:void operator()(int x, int y) {}
};
int main(int argc, char const *argv[])
{//函数对象(仿函数)MyClass c;return 0;
}

B 谓词

概念:

​ 只要 返回值为bool类型的普通函数 或 仿函数 都叫谓词

  • 有一个参数 叫一元谓词
  • 有两个参数 叫二元谓词。
#include <iostream>
using namespace std;
//谓词 
bool method01() {}
// 谓词
class MyClass
{bool operator()() { }
};
//是谓词 更是一元谓词
bool method02(int x) {}
//  二元谓词
bool method03(int x, int y) {}
int main(int argc, char const *argv[])
{return 0;
}

C 内建函数对象

概念 : c++提供的函数对象

1 算法类函数对象

template<classT> T plus<T>//加法仿函数
template<classT> T minus<T>//减法仿函数
template<classT> T multiplies<T>//乘法仿函数
template<classT> T divides<T>//除法仿函数
template<classT> T modulus<T>//取模(取余)仿函数
template<classT> T negate<T>//取反仿函数

注意:6个算数类函数对象,除了negate是一元运算,其他都是二元运算

#include <iostream>
using namespace std;
int main(int argc, char const *argv[])
{// template<classT> T plus<T>//加法仿函数cout << "加法仿函数" << endl;plus<int> p1;int x = p1(21, 4);cout << "x = " << x << endl;// template<classT> T negate<T>//取反仿函数cout << "取反函数不能对bool取反" << endl;negate<int> n1;int z = n1(99);cout << "z = " << z << endl;return 0;
}

在这里插入图片描述

2 关系运算类函数对象

语法:

template<class T> bool equal_to<T>//等于
template<class T> bool not_equal_to<T>//不等于
template<class T> bool greater<T>//大于
template<class T> bool greater_equal<T>//大于等于
template<class T> bool less<T>//小于
template<class T> bool less_equal<T>//小于等于

注意:6个关系运算类函数对象,每一种都是二元谓词

逻辑运算类运算函数

template<class T>bool1ogical_and<T>//逻辑与
template<class T>bool1ogical_or<T>//逻辑或
template<class T>bool1ogical_not<T>//逻辑非

注意:3个逻辑运算类运算函数,not为一元谓词,其余为二元谓词。

D 适配器

1 函数对象适配器

用的函数名: for_each ( )

特点:

  • 函数对象作为适配器

使用:

  • bind2nd 将绑定的数据放置第二个参数位置
  • bind1st 将绑定的数据放置第一个参数位置

步骤:

  • 1,创建一个类
  • 2,使该类继承与binary_function
  • 3,泛型萃取
    • 第一泛型为重载的() 运算符中第一个形参的数据类型
    • 第二泛型为重载的() 运算符中第二个形参的数据类型
    • 第三泛型为重载的()运算符中返回值的数据类型
  • 4,在该类中重载() 运算符 记得尾部加 const

在这里插入图片描述

  • 5,创建该类对象
  • 6,使用算法,在算法适配器中使用bind1st或bind2nd绑定该类对象与传入的值

示例:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// 1,创建一个类 
// 2,使该类继承与binary_function
// 3,泛型萃取
class MyClass : public binary_function<int, int, void>
{public:在该类中重载() 运算符 记得尾部加  constvoid operator()(int x, int y) const{cout << "x = " << x << endl;cout << "y = " << y << endl;}
};
int main(int argc, char const *argv[])
{vector<int> ns;ns.push_back(1);ns.push_back(2);ns.push_back(3);ns.push_back(4);// 第一种遍历方式 auto 自适应去找我的类型  原生的复杂// for (auto it = ns.begin(); it != ns.end(); it++)// {//     cout << *it << endl;// }// 5,创建该类对象MyClass c;
//使用算法,在算法适配器中使用bind1st或bind2nd绑定该类对象与传入的值 必须继承algorithmfor_each(ns.begin(), ns.end(), bind1st(c, 10));return 0;
}

在这里插入图片描述

2 函数指针适配器

特点:

以全局函数 作为适配器 prt_fun(函数名)

使用:

  • bind2nd 将绑定的数据放置第二个参数位置
  • bind1st 将绑定的数据放置第一个参数位置
  • ptr_fun(函数名)

步骤:

  • 1,定义一个全局函数,该函数两个参数
  • 2,使用算法,在算法适配器中使用bind1st或bind2nd绑定该函数与传入的值

示例:

#include <iostream>
#include <set>
#include <algorithm>  //for_each 头文件
using namespace std;void my_test(int x, int y)
{cout << "x = " << x << endl;cout << "y = " << y << endl;
}
int main(int argc, char const *argv[])
{set<int> ns;ns.insert(1);ns.insert(2);ns.insert(3);ns.insert(4);//遍历for_each(ns.begin(), ns.end(), bind2nd(ptr_fun(my_test),99));return 0;
}

在这里插入图片描述

3 成员函数适配器

特点:

将成员函数(地址)作为适配器

使用:

  • bind2nd 将绑定的数据放置第二个参数位置
  • bind1st 将绑定的数据放置第一个参数位置
  • mem_fun_ref(&类名 :: 函数名)

注意

​ mem_fun_ref(&类名::函数名) 包裹的参数只能有一个 所以也就没有绑定

步骤:

  • 1,创建一个类
  • 2,在该类中编写成员函数
  • 3,使用算法,在算法适配器中使用mem_fun_ref包括该函做

注意:

  • 集合中存储的对象所在的类与成员函数所在的类为同一个类
  • 该函数必须是无参的
  • 集合中的获取的数据

示例:

#include <iostream>
#include <list>
#include <algorithm>
using namespace std;
class MyClass
{
public:int x;MyClass(int x) : x(x) {}void my_show(){cout << "x = " << this->x << endl;}
};
int main(int argc, char const *argv[])
{list<MyClass> ls;ls.push_back(MyClass(1));ls.push_back(MyClass(2));ls.push_back(MyClass(3));ls.push_back(MyClass(4));// 遍历for_each(ls.begin(), ls.end(),mem_fun_ref(&MyClass::my_show));return 0;
}

在这里插入图片描述

4 取反适配器

  • notl 一元函数对象取反
  • not2 二元函数对象取反

示例:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void show(int x)
{cout << x << ",";
}
bool dy5(int x, int y)
{return x > y;
}
class MyClass : public binary_function<int, int, bool>
{
public:bool operator()(int x, int y) const{return x > y;}
};
int main(int argc, char const *argv[])
{vector<int> nums;nums.push_back(2);nums.push_back(1);nums.push_back(3);nums.push_back(6);nums.push_back(9);for_each(nums.begin(), nums.end(), ptr_fun(show));cout << endl;// 查找vector中第一个大于5的值//  vector<int>::iterator it =find_if(nums.begin(), nums.end(), bind2nd(ptr_fun(dy5), 5));// auto it =find_if(nums.begin(), nums.end(), bind2nd(MyClass(), 5));auto it = find_if(nums.begin(), nums.end(), not1(bind2nd(MyClass(), 5)));cout << *it << endl;// 排序算法sort(nums.begin(), nums.end(), not2(less<int>()));for_each(nums.begin(), nums.end(), ptr_fun(show));cout << endl;return 0;
}

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

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

相关文章

刷题学习日记 (1) - SWPUCTF

写这篇文章主要是想看看自己一个下午能干啥&#xff0c;不想老是浪费时间了&#xff0c;所以刷多少题我就会写多少题解&#xff0c;使用nss随机刷题&#xff0c;但是今天下午不知道为啥一刷都是SWPUCTF的。 [SWPUCTF 2021 新生赛]gift_F12 控制台ctrlf搜索flag即可&#xff0…

【入门01】arcgis api 4.x 创建地图、添加图层、添加指北针、比例尺、图例、卷帘、图层控制、家控件(附完整源码)

1.效果 2.代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title></title><link rel"s…

物联网行业中通信断线重连现象介绍以及如何实现

01 概述 断线重连是指在计算机网络中&#xff0c;当网络连接遇到异常中断或者断开时&#xff0c;系统会自动尝试重新建立连接&#xff0c;以保证网络通信的连续性和稳定性。这是一种常见的网络通信技术&#xff0c;广泛应用于各种计算机网络场景&#xff0c;包括互联网、局域…

MSVCR100.dll丢失怎么办,教你6种解决MSVCR100.dll丢失的方法

在计算机的日常使用中&#xff0c;我们可能会遇到各种各样的问题&#xff0c;其中之一就是MSVCR100.dll文件丢失。这个文件是Microsoft Visual C 2010的一个组件&#xff0c;如果丢失&#xff0c;可能会导致某些程序无法正常运行。那么&#xff0c;如何解决这个问题呢&#xff…

MySQL Unittest实践(下 Gmock篇)

一、简介 使用Gtest基本上能够满足绝大多数的测试场景&#xff0c;但是对于一些涉及多个模块交互、文件系统、网络通信等复杂的场景&#xff0c;很难仿真一个真实的环境进行单元测试。这时就需要引入模拟对象Mock Objects来模拟程序的一部分来构造测试场景。 Google C Mockin…

【大数据】数据中台怎么样助力企业创新和客户实践

在当今数字化时代&#xff0c;数据成为了企业竞争的关键因素。企业拥有大量的数据&#xff0c;但如何高效地利用这些数据&#xff0c;实现创新和提升客户体验&#xff0c;成为了一项重要的挑战。数据中台作为一种重要的数据管理和分析工具&#xff0c;发挥着关键的作用。本文将…

Select插件的用法

文章目录 1.知识回顾2.使用方法2.1 builder属性2.2 selector属性2.3 shouldRebuild属性2.4 child属性3 示例代码我们在上一章回中介绍了组件之间共享数据相关的内容,本章回中将继续介绍该内容.闲话休提,让我们一起Talk Flutter吧。 1.知识回顾 我们在前面章回中介绍了全局共…

今年1-8月,Temu的客户量下降了25%,Shein和TikTok Shop不降反增

根据Earnest信用卡数据&#xff0c;2024年1月至8月&#xff0c;在Temu平台上交易的购物者减少了约25%&#xff0c;表明该平台的增长放缓。 自上线两年以来&#xff0c;Temu通过打折和广告策略&#xff0c;尤其是在超级碗期间投放大量广告&#xff0c;迅速扩展并广泛影响了爱好…

分享5款AI毕业论文生成系统使用教程!开题报告一键生成!

在当前的学术研究和写作领域&#xff0c;AI论文生成工具的应用越来越广泛。这些工具不仅能够提高写作效率&#xff0c;还能帮助研究人员快速生成高质量的论文内容。今天&#xff0c;我将分享五款AI毕业论文生成系统&#xff0c;并重点推荐千笔-AIPassPaper&#xff0c;帮助你高…

自动驾驶系列—DOW(开门预警):让每一次开门都更安心

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

嵌入式项目:STM32平衡车详解 (基础知识篇) (基于STM32F103C8T6)

前言&#xff1a; 本文是基于B站草履虫编写的平衡车相关内容&#xff0c;包括模块和基础知识&#xff0c;结合代码进行讲解&#xff0c;将知识进行汇总 &#xff08;由于本篇内容较长&#xff0c;请结合目录使用) 注&#xff1a;基于开源精神&#xff0c;本文仅供学习参考 目…

滑动窗口 -- 限制窗口内某元素的数量/种类

目录 长度最小的数组 题解&#xff1a; 将x减到0的最小操作数 题解&#xff1a; 最大连续1的个数 题解&#xff1a; 无重复字符的最长子串&#xff08;限制数量&#xff09; 题解&#xff1a; 水果成篮&#xff08;限制种类&#xff09; 题解&#xff1a; 找到字符串中…

Studying-图论包含的算法总结

目录 1.DFS&#xff08;深度优先搜索&#xff09; 代码框架&#xff1a; 2. BFS&#xff08;广度优先搜索&#xff09; 代码框架&#xff1a; 3. 并查集 4.最小生成树之Prim 5.最小生成树之Kruskal 6.拓扑排序 7. 最短路径之-dijkstra&#xff08;朴素版&#xff…

淘宝霸屏必备工具:淘宝商品评论电商API接口

淘宝商品评论电商API接口是指用于获取淘宝商品评论信息的一种接口&#xff0c;通过该接口可以获取淘宝网上商品的评价内容、评价等级、评价数量等信息。通过了解并使用该接口&#xff0c;能够帮助电商了解消费者对商品的评价情况&#xff0c;做好商品的推广和销售工作。 接口使…

Leetcode - 周赛416

目录 一&#xff0c;3295. 举报垃圾信息 二&#xff0c;3296. 移山所需的最少秒数 三&#xff0c;3297. 统计重新排列后包含另一个字符串的子字符串数目 I 四&#xff0c;3298. 统计重新排列后包含另一个字符串的子字符串数目 II 一&#xff0c;3295. 举报垃圾信息 本题就是…

消息号 FS215 对科目 2221010200 7333允许销项税, J1 不允许

业务场景&#xff1a; 在做发票校验时&#xff0c;报错“消息号 FS215 对科目 2221010200 7333允许销项税, J1 不允许”而且计算税额失效&#xff0c;红灯报错。 初步怀疑是税码配置问题 FTXP J1是进项税&#xff0c;但是这里维护了销项税和均一税&#xff0c;在这里删除是需…

SQLSERVER通过触发器限制客户端IP地址

方法一&#xff1a;SQL Server 2005 SP2或更高版本(触发器) 当SQL Server 2005升级到SP2或者更高的版本的时候&#xff0c;还可以通过新增的触发器来实现控制。 执行下面的T-SQL后&#xff0c;将使除IP地址为192.168.1.1之外的客户端连接失败。 USE master; GO CREATE TRIGGE…

CMA软件检测机构人员职责分类、要求、档案资料

一、CMA软件检测机构人员职责分类&#xff1a; 1、最高管理者 2、授权签字人 3、技术负责人 4、质量负责人 5、软件测试人员 &#xff08;从事软件测试项目管理、测试需求分析、测试策划和测试设计活动的人员、软件测试执行人员&#xff09; 6、报告编制员 7、报告审核…

革新体验:细数3D在线预览在多个行业的广泛应用

‌3D在线预览展示技术的应用领域非常广泛&#xff0c;涵盖了从电子商务、产品设计、建筑设计到文化遗产保护等多个方面。‌ ‌1、电子商务‌&#xff1a; 在电商领域&#xff0c;3D展示技术为商品提供了全方位的展示&#xff0c;包括产品的外观、功能和卖点。这种交互式的购物…

【Docker】01-Docker常见指令

1. Docker Docker会下载镜像&#xff0c;运行的时候&#xff0c;创建一个隔离的环境&#xff0c;称为容器。 docker run -d \ # 创建并运行一个容器&#xff0c;-d表示后台运行 --name mysql \ # 容器名称-p 3307:3306 \ # 端口映射&#xff0c;宿主机端口映射到容器端口-e TZ…