STL函数对象

1,函数对象

1.1 函数对象概念

概念:

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

本质:

函数对象(仿函数)是一个类,不是一个函数

1.2 函数对象使用

特点:

  • 函数对象在使用是,可以像普通函数那样调用,可以有返回值
  • 函数对象超出普通函数的概念,函数对象可以有自己的状态
  • 函数对象可以作为参数传递

示例:

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

总结:

仿函数写法非常灵活,可以作为参数进行传递 

2,谓词

2.1谓词概念:

概念:

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

2.2 一元谓词

返回 operator()接受一个参数,那么叫做一元谓词

#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);}//查找容器中 有没有大于五的数字//GreaterFive()匿名函数对象vector<int>::iterator it= find_if(v.begin(), v.end(), GreaterFive());if (it == v.end()){cout << "未找到" << endl;}else{cout << "找到了大于5的数字为:" << *it << endl;}
}int main()
{test01();system("pause");return 0;
}

2.3 二元谓词

返回 operator()接受两个参数,那么叫做二元谓词

示例:

#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>//仿函数 返回值类型数bool数据类型 称为谓词
//二元谓词class MyCompare
{
public:bool operator()(int val1,int val2){return val1 > val2;}
};void test01()
{vector<int>v;v.push_back(10);v.push_back(40);v.push_back(20);v.push_back(30);v.push_back(50);//默认排序规则为从小到大sort(v.begin(), v.end());for (vector<int>::iterator it = v.begin(); it != v.end(); it++){cout << *it << " ";}cout << endl;//使用函数对象,改变算法策略,变为排序规则为从大到小sort(v.begin(), v.end(), MyCompare());cout << "-------------------------------------" << endl;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 内建函数对象的意义

概念:

  • STL内建了一些函数对象

分类:

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

用法:

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

3.1.1 算术仿函数

功能描述:

  • 实现四则运算
  • 其中negate是一元运算,其他都是二元运算

仿函数原型:

  • template<class T> T plus<T>    //加法仿函数
  • template<class T> T minus<T>    //减法仿函数
  • template<class T> T miltiplies<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<vector>
#include<algorithm>
#include<functional>//内建函数对象 算术仿函数//negete 一元仿函数 取反仿函数
void test01()
{negate<int>n;cout << "取反仿函数" << endl;cout << n(50) << endl;
}//加法仿函数
void test02()
{plus<int>p;cout << "加法仿函数" << endl;cout << p(10, 20) << endl;
}//减法仿函数
void test03()
{minus<int>m;cout << "减法仿函数" << endl;cout << m(20, 10) << endl;
}//乘法仿函数
void test04()
{multiplies<int>mul;cout << "乘法仿函数" << endl;cout << mul(10, 20) << endl;
}//除法仿函数
void test05()
{divides<int>div;cout << "除法仿函数" << endl;cout << div(20, 10) << endl;
}//取模仿函数
void test06()
{modulus<int>mod;cout << "取模法仿函数" << endl;cout << mod(20, 10) << endl;
}int main()
{test01();test02();test03();test04();test05();test06();system("pause");return 0;
}

 

3.1.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>        //小于等于仿函数

示例: 

#include<iostream>
using namespace std;
#include<algorithm>
#include<vector>
#include<functional>//内建函数对象 关系仿函数
//大于 greater
class MyCompare
{
public:bool operator()(int v1, int v2){return v1 > v2;}
};void test01()
{vector<int>v;v.push_back(10);v.push_back(20);v.push_back(30);v.push_back(40);v.push_back(50);for (vector<int>::iterator it = v.begin(); it != v.end(); it++){cout << *it << " ";}cout << endl;//降序cout << "---------------降序:--------------------" << endl;//sort(v.begin(), v.end(), MyCompare());sort(v.begin(), v.end(), greater<int>());for (vector<int>::iterator it = v.begin(); it != v.end(); it++){cout << *it << " ";}cout << endl;
}class MyCompare1
{
public:bool operator()(int v1, int v2){return v1 == v2;}
};int main()
{test01();system("pause");return 0;
}

3.1.3 逻辑仿函数

函数原型:

  • 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<algorithm>
#include<vector>
#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.hqwc.cn/news/614872.html

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

相关文章

【网站项目】数学辅导微信小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

数据结构速成--数据结构和算法

由于是速成专题&#xff0c;因此内容不会十分全面&#xff0c;只会涵盖考试重点&#xff0c;各学校课程要求不同 &#xff0c;大家可以按照考纲复习&#xff0c;不全面的内容&#xff0c;可以看一下小编主页数据结构初阶的内容&#xff0c;找到对应专题详细学习一下。 目录 一…

Linux 使用 ifconfig 报错:Failed to start LSB: Bring up/down networking

一、报错信息 在运行项目时报错数据库连接失败&#xff0c;我就想着检查一下虚拟机是不是 Mysql 服务忘了开&#xff0c;结果远程连接都连接不上虚拟机上的 Linux 了&#xff0c;想着查一下 IP 地址看看&#xff0c;一查就报错了&#xff0c;报错信息&#xff1a; Restarting…

前端Vue中基于uQRCode的二维码生成插件:从入门到精通的应用与实践(适配Vue3)

前端Vue中基于uQRCode的二维码生成插件&#xff1a;从入门到精通的应用与实践(适配Vue3) 在数字化时代&#xff0c;二维码作为一种信息传递的便捷方式&#xff0c;已经渗透到我们生活的方方面面。无论是微信扫码支付、网页链接跳转&#xff0c;还是广告宣传、身份验证等场景&am…

基于Whisper语音识别的实时视频字幕生成 (一): 流式显示视频帧和音频帧

Whishow Whistream&#xff08;微流&#xff09;是基于Whisper语音识别的的在线字幕生成工具&#xff0c;支持rtsp/rtmp/mp4等视频流在线语音识别 1. whishow介绍 whishow&#xff08;微秀&#xff09;是python实现的在线音视频流播放器&#xff0c;支持rtsp/rtmp/mp4等流式输…

C语言--结构体大小

基本数据类型占用的字节数分别为:char(1),short(2),int(4),long(4),long long(8),float(4),double(8)。 分析一下下面结构体占用的字节数。 struct A { int a; }; struct B { char a; int b; }; int main() { printf("sizeof(struct A)%d\n", sizeof(struct A));//测…

抽象的算法0.1.1版本

前言&#xff1a;在0.1版本中&#xff0c;我们得到了可迭代的超级模板&#xff0c;问题简单化 最近看到一本十分厉害的电子书&#xff0c;其中两句话让我虎躯一震&#xff0c;这就是大佬的思维&#xff01; 第一句话&#xff1a;数学是用来描述万物本质的语言&#xff0c;是理…

Comparablae接口

在日常生经常涉及到排序的的问题&#xff0c;排序问题中又不得不涉及到比较的问题。在排序问题中根据不同的规则对多个对象进行比较&#xff0c;然后根据比较内容的不同对对象进行排序。java中的Comparable就是用来定义排序规则的接口。当要对类中的对象进行排序操作时&#xf…

MYSQL5.7详细安装步骤

MYSQL5.7详细安装步骤&#xff1a; 0、更换yum源 1、打开 mirrors.aliyun.com&#xff0c;选择centos的系统&#xff0c;点击帮助 2、执行命令&#xff1a;yum install wget -y 3、改变某些文件的名称 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base…

C语言 | Leetcode C语言题解之第26题删除有序数组中的重复项

题目&#xff1a; 题解&#xff1a; int removeDuplicates(int* nums, int numsSize) {if (numsSize 0) {return 0;}int fast 1, slow 1;while (fast < numsSize) {if (nums[fast] ! nums[fast - 1]) {nums[slow] nums[fast];slow;}fast;}return slow; }

能看会说的人形机器人,对话的样子吓到我了

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 新建了免费的人工智能中文站https://ai.weoknow.com 新建了收费的人工智能中文站https://ai.hzytsoft.cn/ 更多资源欢迎关注 还记得这个表情宛如真人的人形机器人吗&#xff1f; ta被取名Ameca&#xff0c;由一家名为「…

模板方法模式:定义算法骨架的设计策略

在软件开发中&#xff0c;模板方法模式是一种行为型设计模式&#xff0c;它在父类中定义一个操作的算法框架&#xff0c;允许子类在不改变算法结构的情况下重定义算法的某些步骤。这种模式是基于继承的基本原则&#xff0c;通过抽象类达到代码复用的目的。本文将详细介绍模板方…