STL——函数对象

目录

1.函数对象

1.1函数对象概念

1.2函数对象使用

2.谓词

2.1谓词概念

2.2一元谓词

2.3二元谓词

3.内建函数对象

3.1内建函数对象意义

3.2算数仿函数

3.3关系仿函数

3.4逻辑仿函数


1.函数对象

1.1函数对象概念

概念:

  • 重载函数调用操作符的类,其对象常称为函数对象
  • 函数对象使用重载的()时,行为类似函数调用,也叫仿函数

本质:函数对象(仿函数)是一个,不是一个函数 

1.2函数对象使用

特点:

  • 函数对象在使用时,可以像普通函数那样调用, 可以有参数,可以有返回值
  • 函数对象超出普通函数的概念,函数对象可以有自己的状态
  • 函数对象可以作为参数传递
#include<iostream>
using namespace std;
//函数对象——仿函数
class MyAdd
{
public:int operator()(int v1, int v2){return v1 + v2;}
};
//1.函数对象在使用时,可以像普通函数那样调用,可以有参数,可以有返回值
void test01()
{MyAdd myadd;cout << myadd(10, 10) << endl;
}
//2.函数对象超出普通函数的概念,函数对象可以有自己的状态
class MyPrint
{
public:MyPrint(){this->count = 0;}void operator()(string test){cout << test << endl;count++;}int count;//内部自己的状态
};
void test02()
{MyPrint myprint;myprint("hello world!");myprint("hello world!");cout << "myprint调用的次数:" << myprint.count << endl;
}
//3.函数对象可以作为参数传递
void doPrint(MyPrint&mp,string test)
{mp(test);
}
void test03()
{MyPrint myprint;doPrint(myprint, "hello C++");
}
int main()
{//test01();//test02();test03();system("pause");return 0;
}

2.谓词

2.1谓词概念

概念:

  • 返回bool类型的仿函数称为谓词
  • 如果operator()接受一个参数,那么叫做一元谓词
  • 如果operator()接受两个参数,那么叫做二元谓词

2.2一元谓词

#include<iostream>
using namespace std;
#include<vector>
//谓词——仿函数返回值是bool数据类型
//一元谓词
class GreaterFive
{
public:bool operator()(int val){return val > 5;}
};
void test01()
{vector<int>v;for (int i = 0; i < 10; i++){v.push_back(i);}//查找容器中有没有大于5的数字//GreaterFive()匿名函数对象vector<int>::iterator it = find_if(v.begin(), v.end(), GreaterFive());if (it == v.end()){cout << "没有找到" << endl;}else{cout << "找到了:" << *it << endl;}
}
int main()
{test01();system("pause");return 0;
}

2.3二元谓词

#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
//二元谓词
class MyCompare
{
public:bool operator()(int v1, int v2){return v1 > v2;}
};
void test01()
{vector<int>v;v.push_back(10);v.push_back(50);v.push_back(30);v.push_back(90);v.push_back(40);sort(v.begin(), v.end());for (vector<int>::iterator it = v.begin(); it != v.end(); it++){cout << *it << " ";}cout << endl;//使用函数对象 改变算法策略,变为降序排序// MyCompare()匿名函数对象sort(v.begin(), v.end(), MyCompare());for (vector<int>::iterator it = v.begin(); it != v.end(); it++){cout << *it << " ";}cout << endl;
}
int main()
{test01();system("pause");return 0;
}

3.内建函数对象

3.1内建函数对象意义

分类:

  • 算术仿函数
  • 关系仿函数
  • 逻辑仿函数

用法:

  • 这些仿函数所产生的对象,用法和一般函数完全相同
  • 使用内建函数对象,需要引入头文件  #include<functional>

3.2算数仿函数

仿函数原理:

  • template<class T> T plus<T> ——//加法仿函数
  • template<class T> T minus<T> ——//减法仿函数
  • template<class T> T multiplies<T> ——//乘法仿函数
  • template<class T> T divides<T> ——//除法仿函数
  • template<class T> T modulus<T> ——//取模仿函数
  • template<class T> T negate<T> ——//取反仿函数
#include<iostream>
using namespace std;
#include<functional>
//内建仿函数  算数仿函数
//negate——取反(一元仿函数)
void test01()
{negate<int>n;cout << n(50) << endl;
}
//plus——取和(二元仿函数)
void test02()
{plus<int>p;cout << p(5, 50) << endl;
}
int main()
{//test01();test02();system("pause");return 0;
}

3.3关系仿函数

仿函数原型:

  • 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> ——//小于等于
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
class MyCompare
{
public:bool operator()(int v1, int v2){return v1 > v2;}
};
void test01()
{vector<int>v;v.push_back(10);v.push_back(60);v.push_back(30);v.push_back(70);v.push_back(20);for (vector<int>::iterator it = v.begin(); it != v.end(); it++){cout << *it << " ";}cout << endl;//降序//sort(v.begin(), v.end(), MyCompare());//greater<int>()内建函数对象sort(v.begin(), v.end(), greater<int>());for (vector<int>::iterator it = v.begin(); it != v.end(); it++){cout << *it << " ";}cout << endl;
}
int main()
{test01();system("pause");return 0;
}

3.4逻辑仿函数

函数原型:

  • template<class T> bool logical_and<T> ——//逻辑与
  • template<class T> bool logical_or<T> ——//逻辑或
  • template<class T> bool logical_not<T> ——//逻辑非
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
#include<functional>
//逻辑仿函数
//逻辑非——logical_not
void test01()
{vector<bool>v;v.push_back(true);v.push_back(false);v.push_back(true);v.push_back(false);for (vector<bool>::iterator it = v.begin(); it != v.end(); it++){cout << *it << " ";}cout << endl;//利用逻辑非 将容器v搬运到容器v2中,并执行取反操作vector<bool>v2;v2.resize(v.size());transform(v.begin(), v.end(), v2.begin(), logical_not<bool>());for (vector<bool>::iterator it = v2.begin(); it != v2.end(); it++){cout << *it << " ";}cout << endl;
}
int main()
{test01();system("pause");return 0;
}

 

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

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

相关文章

C_11微机原理练习题答案

一、单项选择题(本大题共 15 小题,每小题 3分,共45分。在每小题给出的四个备选项中,选出一个正确的答案。) .EXE 文件产生在(D)之后。A.汇编 B. 编辑 C.用软件转换 D.连接 2,十进制-61的8位二进制原码是(D)A. 00101111 B. 00111101 C. 10101111 D. 10111101 某机存储器…

GEE错误——‘xxx‘ did not match any bands.

这里我们在进行影像展示的时候会出现下面的错误,主要的原因是我们虽然进行了波段运算,但是依旧无法加载,主要原因是我们没有将计算过后的波段信息进行添加到我们的一个多波段影像,这里我们首先来看看代码出现的错误提示。当然这里只是给出了主要的问题,其实在进行波段运算…

Visual Basic入门指南(一)

Visual Basic入门指南 Visual Basic是一种由微软公司开发的简单、易学的编程语言。它被广泛应用于Windows应用程序的开发&#xff0c;并且有着强大的可视化编程能力。本文将介绍Visual Basic的基础知识和常用技巧&#xff0c;帮助读者快速入门。 环境准备 随便找一个软件安装…

Android系列-LayoutInflater 几个 inflate方法的区别

&#xff08;来自chatgpt的回答&#xff09; LayoutInflater 提供了多个 inflate 方法&#xff0c;用于将 XML 布局文件解析为相应的视图对象。这些方法的主要区别在于参数的组合和用途。以下是常见的几个 inflate 方法及其区别&#xff1a; 1.inflate(int resource, ViewGro…

java在线票务系统(选座)Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java servlet 在线票务系统&#xff08;选座&#xff09;管理系统是一套完善的java web信息管理系统 系统采用serlvetdaobean&#xff08;mvc模式)&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要…

PowerShell Instal 一键部署TeamCity

前言 TeamCity 是一个通用的 CI/CD 软件平台,可实现灵活的工作流程、协作和开发实践。允许在您的 DevOps 流程中成功实现持续集成、持续交付和持续部署。 系统支持 Centos7,8,9/Redhat7,8,9及复刻系列系统支持 Windows 10,11,2012,2016,2019,2022高版本建议使用9系列系统…

从0到1快速入门ETLCloud

一、ETLCloud的介绍 ETL是将业务系统的数据经过抽取&#xff08;Extract&#xff09;、清洗转换&#xff08;Transform&#xff09;之后加载&#xff08;Load&#xff09;到数据仓库的过程&#xff0c;目的是将企业中的分散、凌乱、标准不统一的数据整合到一起&#xff0c;为企…

CentOS7 系统安装

系统下载 官方下载 清华源下载 安装流程 1. 选择安装系统 2. 选择安装语言 3. 设置网络链接 4. 设置静态IP ![img](https://img-blog.csdnimg.cn/img_convert/53bfedd54b838f95bd8bcb2efa232e23.png)设置时区 5. 磁盘设置&#xff0c;无特殊需求默认就好 6. 安装模式选择 7…

安装驱动导致ubuntu开不了机

ubuntu系统&#xff0c;安装mmdeploy时想换nvidia驱动&#xff0c;换了之后按网上说的换cuda&#xff0c;重启后出问题&#xff0c;进不了系统&#xff0c;黑屏&#xff0c;闪烁之后也不出来字&#xff0c;出不来系统选择目录。 把主板上的纽扣电池拿下来放电&#xff0c;过几…

Spark应用程序的结构与驱动程序

Apache Spark是一个强大的分布式计算框架&#xff0c;用于处理大规模数据。了解Spark应用程序的结构和驱动程序是构建高效应用的关键。本文将深入探讨Spark应用程序的组成部分&#xff0c;以及如何编写一个Spark驱动程序来处理数据和执行计算。 Spark应用程序的结构 Spark应用…

LeetCode第53题 - 最大子序和

题目 给定一个整数数组 nums &#xff0c;找到一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 解答 方案一&#xff1a; public int maxSubArray(int[] nums) {if (nums null || nums.length 0) {return 0;}int[] s…

cleanmymac这个软件怎么样?值不值得下载

cleanmymac是我必装的mac端清理软件&#xff0c;界面简洁好看&#xff0c;完美适配mac系统&#xff0c;文件清理的速度、精度都比较优秀&#xff0c;还是比较不错的呢。cleanmymac作为一款第三方清洁应用程序&#xff0c;具有专业完整的清理功能&#xff0c;包括释放内存、一键…

【Redis交响乐】Redis中的通用命令

文章目录 1. 基本命令 get set2. 全局命令(1)keys(2)exists(3)del(4)expire && ttl面试题: redis中key的过期策略是怎么实现的?定时器的实现原理(1)基于优先级队列/堆(2)基于时间轮实现的定时器 (5) type 我们知道,redis是按照键值对的方式存储数据的. Redis中基本的命…

前端知识的不足与补充

css中的grid布局 display: grid;grid-template-columns: 1fr 25px 25px 25px 25px 1fr;grid-template-rows: 50px 1fr 1fr 50px;/* 创造一个网格布局6 个纵列&#xff08;column&#xff09; -- 前后两列两等分 (可用 fr 代表一份)&#xff0c;中间 4 列均为 25px 宽度4 个横行…

[Mac软件]App Cleaner Uninstaller 8.2.5应用程序清理和卸载

App Cleaner & Uninstaller是一款Mac应用程序&#xff0c;它可以帮助用户完全删除应用程序及其相关的服务文件、扩展文件等。以下是该应用程序的主要功能&#xff1a; 1. 完全删除应用程序&#xff1a;通过将应用程序图标拖到垃圾桶中删除程序&#xff0c;可以彻底清除应用…

【微服务核心笔记】

一、注册中心 Nacos Alibaba Nacos,服务提供者和服务消费者将自己的信息注册到注册中心,注册中心通过心跳机制来确保每个服务都可以正常运行,服务消费者订阅注册中心,注册中心为服务消费者推送变更信息 1、功能 动态服务发现配置管理2、搭建 创建 nacos 所需要的数据库在服…

根据文法求对应的语言

技巧&#xff1a;最后得到的是终结符组成的闭包 例题&#xff1a; 文法G[S]: S-->AB A-->aAb|ab B-->Bc|&#xff0c;求对应的语言 ①S-->(aAb|ab)(Bc|) ②我们可以观察到&#xff0c;无论A-->aAb还是A-->ab&#xff0c;都一定会同时出现ab,…

3、python-常见数据类型-元组(tuple)

简介 元组是一种不可变序列 元组也是一种序列&#xff0c;因此也可以对它进行索引、分片 一.定义元组 # TODO a 是一个元组 a (1, 2, 3) # TODO 空元组 b () # TODO 元组是以逗号分割 c (12) d (12,) print(a) print(b) print(c) print(d)# (1, 2, 3) # () # 12 # (12,)…

Java学习——设计模式——结构型模式1

文章目录 结构型模式代理模式适配器模式 结构型模式 结构型模式主要涉及如何组合各种对象以便获得更好、更灵活的结构。虽然面向对象的继承机制提供了最基本的子类扩展父类的功能&#xff0c;但结构型模式不仅仅简单地使用继承&#xff0c;而更多地通过组合与运行期的动态组合来…

NModbus-一个C#的Modbus协议库实现

NModbus-一个基于C#实现的Modbus通信协议库 最近在学习C#的时候&#xff0c;因为之前做过环保设备时使用C做过环保设备采集使用到了Modbus协议&#xff0c;当时看了一下基于C语言开发的libmodbus库。所以特意搜索看了一下C#下有什么Modbus协议库&#xff0c;在Github上面找了一…