C++_24_适配器

news2024/9/29 6:26:56

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:
    在该类中重载() 运算符 记得尾部加  const
    void 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绑定该类对象与传入的值 必须继承algorithm
    for_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.coloradmin.cn/o/2168280.html

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

相关文章

OCI 简介:Kubernetes 环境下从代码到容器的全流程

OCI 简介 在容器化技术的演进中&#xff0c;OCI&#xff08;Open Container Initiative&#xff09;提供了一套标准化的规范&#xff0c;帮助统一容器的构建、分发和运行。OCI 规范包含三个部分&#xff1a; OCI Image-spec&#xff1a;定义了容器镜像的结构&#xff0c;确保…

自闭症儿童寄宿学校揭秘:全方位呵护孩子成长

自闭症儿童寄宿学校揭秘&#xff1a;星贝育园——全方位呵护孩子成长的温馨港湾 在繁华的广州城&#xff0c;有一所专为自闭症儿童打造的温馨家园——星贝育园自闭症儿童寄宿制学校。这里&#xff0c;不仅是一个提供专业康复训练的地方&#xff0c;更是一个充满爱与关怀的成长…

DVWA 靶场环境搭建

作者&#xff1a;程序那点事儿 日期&#xff1a;2024/09/15 09:30 什么是DVWA: 是OWSASP官方编写的PHP网站&#xff0c;包含了各种网站常见漏洞&#xff08;漏洞靶场&#xff09;&#xff0c;可以学习攻击及修复方式。 PHP环境包含了&#xff0c;Windows/Apache/Mysql/Php g…

【小程序】微信小程序课程 -2 快速上手

目录 1、快速上手基本概念 1.1 小程序常用组件 1.2 tabbar配置 1.3 尺寸单位 1.4 样式 1.4.1 全局样式 app.wxss 1.4.2 局部样式 xx.wxss 2、首页案例 2.1 button组件使用 2.2 swiper swiper-item 2.3 tips效果 2.4 引入矢量图 2.5 flex&#xff08;布局&#…

11. Map和Set

一、二叉搜索树 1. 概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树&#xff1a; 若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根节点的值若它的右子树不为空&#xff0c;则右子树上所有节点的值都大于根…

一篇文章讲清楚synchronized关键字的作用及原理

概述 在应用Sychronized关键字时需要把握如下注意点&#xff1a; 一把锁只能同时被一个线程获取&#xff0c;没有获得锁的线程只能等待&#xff1b; 每个实例都对应有自己的一把锁(this),不同实例之间互不影响&#xff1b;例外&#xff1a;锁对象是*.class以及synchronized修…

Docker全家桶:Docker Compose项目部署

在学习完了前面的基础知识之后&#xff0c;我们现在可以开始部署完整的项目了。项目分成两个部分&#xff0c;前端和后端&#xff0c;并且采用前后端分离的形式。对应到docker&#xff0c;就是前端和后端分别对应一个容器。把这两个容器加入到同一个网段中&#xff0c;就能够进…

iOS OC 底层原理之 category、load、initialize

文章目录 category底层结构runtime 执行 category 底层原理添加成员变量 load调用形式系统调用形式的内部原理源码实现逻辑 initialize调用形式源码核心函数&#xff08;由上到下依次调用&#xff09;如果分类实现了 initialize category 底层结构 本质是结构体。struct _cat…

找不到MSVCR100.dll怎么办,解决MSVCR100.dll丢失的六种方法

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

齿轮家族中的重要一分子——钟表齿轮

机械钟表的起源## 标题 由于日晷需要阳光来计时&#xff0c;人们发明了用水和沙子计时的钟表&#xff0c;以及燃烧煤油、观察煤油体积减少来计时的钟表&#xff0c;但这些钟表的可靠性较低。因此&#xff0c;人们发明了不需要水和沙子等流体的机械钟表。 1300年左右&#xff…

【Java】异常处理 —— Throwable 及其应用

通过一张图来展示Throwable类的继承体系&#xff0c;如图2所示。 图2 Throwable异常体系结构图 ● Error类称为错误类&#xff0c;它表示Java运行时产生的系统内部错误或资源耗尽的错误&#xff0c;是比较严重的&#xff0c;仅靠修改程序本身是不能恢复执行的&#xff0c;例如…

工业制造场景中的设备管理深度解析

在工业制造的广阔领域中&#xff0c;设备管理涵盖多个关键方面&#xff0c;对企业的高效生产和稳定运营起着举足轻重的作用。 一、设备运行管理 1.设备状态监测 实时监控设备的运行状态是确保生产顺利进行的重要环节。通过传感器和数据采集系统等先进技术&#xff0c;获取设备…

衡石分析平台系统管理手册-功能配置之应用集市管理

页面设置​ 标签页设置​ 应用集市管理员基于实际业务需求&#xff0c;可以在系统管理->页面设置中对应用集市的标签页进行设置&#xff0c;包括定义标签页名称、调整展示顺序和隐藏标签。普通用户不支持标签页设置。 重命名&#xff1a;支持对我的空间和公共空间进行重命…

java SE -- 线程 asset

一.进程 进程&#xff0c;是正在运行的程序实例&#xff0c;是操作系统进行资源分配的最小单位。每个进程都有它自己的地址空间和系统资源&#xff08;比如CPU时间&#xff0c;内存空间&#xff0c;磁盘IO等&#xff09;。多个进程可以同时执行&#xff0c;每个进程在运行时都…

【OSS安全最佳实践】对OSS表格文件中的敏感数据进行脱敏

使用数据安全中心 DSC&#xff08;Data Security Center&#xff09;的静态脱敏&#xff0c;对当前账号下源OSS Bucket中的结构化TXT、CSV、XLSX和XLS格式文件中的敏感数据进行脱敏&#xff0c;然后将脱敏后的文件保存到当前账号下的目标OSS Bucket&#xff0c;实现数据的安全共…

vue实现文件解压缩

1. 使用CompressionStream API实现压缩 这里开启了多线程解压缩 <template><div class"page"><input type"file" placeholder"选择文件" id"file" /><button click"compress(compress)">压缩<…

基础算法(4)——前缀和

1. 前缀和 题目描述&#xff1a; 解法一&#xff1a;暴力解法 直接模拟实现题目流程即可 时间复杂度为&#xff0c;根据题目给出的条件&#xff0c;肯定会超时 解法二&#xff1a;前缀和&#xff08;适用题型&#xff1a;快速 求出数组中某一个 连续区间 的 和&#xff09;…

什么录屏软件最好?这四款软件留着有用!

在这个数字化时代&#xff0c;无论是教学分享、游戏直播还是产品演示&#xff0c;高质量的录屏软件都成为了我们不可或缺的工具。面对市面上琳琅满目的选择&#xff0c;到底哪款录屏软件才能真正满足你的需求&#xff0c;成为你创作路上的得力助手呢&#xff1f;别急&#xff0…

如何调用Ascend C算子

Ascend C是CANN针对算子开发场景推出的编程语言&#xff0c;原生支持C和C标准规范&#xff0c;兼具开发效率和运行性能。基于Ascend C编写的算子程序&#xff0c;通过编译器编译和运行时调度&#xff0c;运行在昇腾AI处理器上。使用Ascend C&#xff0c;开发者可以基于昇腾AI硬…

【ADC】ΔΣ ADC 中数字滤波器的延迟以及 SAR ADC 与 ΔΣ ADC 的差异对比总结

本文学习于TI 高精度实验室课程&#xff0c;深入探讨 delta-sigma 转换器中使用的数字滤波器。具体来说&#xff0c;本文将重点介绍数字滤波器如何引入延迟&#xff0c;因为这是 SAR 和 delta-sigma ADC 之间的显著差异。 文章目录 一、低延迟数字滤波器二、高延迟数字滤波器三…