C++——STL标准模板库——函数对象

一、基本概念

函数对象也叫仿函数,是通过一个类封装了()的重载函数,该类实例化对象就叫做函数对象。这意味着函数可以被赋值给变量,可以作为参数传递给其他函数,也可以作为返回值从函数中返回。主要用于算法的自定义行为或者回调函数等。

函数对象不仅封装了()的重载函数,还可以定义自身的成员属性用来实现更复杂的目的。

二、谓词

返回值为bool类型的()重载函数对象叫做谓词。参数列表中只需接收一个参数的叫做一元谓词,接收两个参数的叫做二元谓词。C++STL中很多算法参数列表中显示需要一个名字叫_Pred的东西,大多数情况下就是需要一个谓词。

class GreatFive {							//一元谓词
public:bool operator()(int value) {return value > 5;}
};
void test() {vector<int> v{ 1,2,3,4,5,6,7,8,9 };auto it = find_if(v.begin(), v.end(), GreatFive());cout << *it << endl;
}

代码中GreatFive就是一元谓词,it返回指向第一个大于5的元素的迭代器 。

template<class C>
void printC(const C& c) {for (typename C::const_iterator it = c.begin(); it != c.end(); it++) {cout << (*it) << " ";}cout << endl;
}class MyCompare {							//二元谓词
public:bool operator()(int v1,int v2) {return v1 > v2;}
};
void test() {vector<int> v{ 1,3,2,5,4 };sort(v.begin(), v.end());printC(v);sort(v.begin(), v.end(), MyCompare());printC(v);
}

代码中MyCompare就是二元谓词,sort算法默认递增排序,通过MyCompare实现递减排序

三、内建函数对象

STL中提供了多种内置的函数对象,用来实现内置数据类型的基础运算、关系比较以及逻辑与、或、非,在使用内建函数时需要:#include <functional>

(一)算术仿函数

template<class T> T pluse<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>       //取反仿函数

除了取反是一元运算,其他函数对象都是二元运算

//for_each是STL提供的遍历算法,可以自定义遍历过程中的功能,需要包含algorithm,
//需要提供一个只接收一个参数的函数。//transform函数时STL提供的复制算法,将一个容器的元素逐一复制到另一个容器,
//过程中可以自定义处理功能,需要提供一个只接收一个参数的函数,并返回该参数类型。
//所以不能直接使用modulus的()重载void print(int&a) {											//为for_each遍历算法提供输出功能函数cout << a << " ";
}
int ModulusBy5(int &a) {									//为transform复制算法提供数据处置功能return modulus<int>()(a, 5);							//modulus仿函数
}
void test() {vector<int> v{ 1,2,3,4,5,6,7,8,9 };vector<int> v1;v1.resize(v.size());									//复制前需要开辟相应的空间for_each(v.begin(), v.end(), print); cout << endl;		//遍历v容器transform(v.begin(), v.end(), v1.begin(), ModulusBy5);	//将[v.begin(),v.end())内的元素逐一经过ModulusBy5处理,复制到v1for_each(v1.begin(),v1.end(), print);					//遍历v1容器
}

(二)关系仿函数

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>             //小于等于

//sort算法是STL提供的排序算法模板函数,默认递增排序,源码中默认使用二元谓词less<>()
//当容器中存储的是自定义类型或者内置类型递减排序时需要提供其他的排序函数对象(二元谓词)
//greater<T> 是STL提供的递减排序的二元谓词
void print(int&a) {cout << a << " ";
}void test() {vector<int>v({ 4,2,5,3,1,7,6 });sort(v.begin(), v.end());for_each(v.begin(), v.end(), print); cout << endl;sort(v.begin(), v.end(), greater<int>());for_each(v.begin(), v.end(), print); cout << endl;
}

(三)逻辑仿函数

template<class T> bool logical_and<T>;                逻辑与

template<class T> bool logical_or<T>;                   逻辑或

template<class T> bool logcial_not<T>;                  逻辑非

//利用transform将v中的bool类型经过func的处理复制到d中
//使用逻辑非内建函数对象bool func(const bool& b) {return  logical_not<bool>()(b);
}
template<class T>
void print(const T& b) {cout << b << " ";
}
void test() {vector<bool>v{ true,false,true,false,true,false };deque<bool>d;d.resize(v.size());for_each(v.begin(), v.end(), print<bool>); cout << endl;transform(v.begin(), v.end(), d.begin(), func);for_each(d.begin(), d.end(), print<bool>);
}

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

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

相关文章

续签KES证书

MiniO KES&#xff08;密钥加密服务&#xff09;是 MinIO 开发的一项服务&#xff0c;旨在弥合在 Kubernetes 中运行的应用程序与集中式密钥管理服务 &#xff08;KMS&#xff09; 之间的差距。中央 KMS 服务器包含所有状态信息&#xff0c;而 KES 在需要执行与获取新密钥或更新…

Halcon基于相关性的模板匹配create_ncc_model

Halcon基于相关性的模板匹配 基于相关性的模板匹配也是一种基于灰度特征的匹配方法。该方法使用一种基于行向量的归一化互相关匹配法&#xff0c;在检测图像中匹配模板图像。与基于灰度值的匹配相比&#xff0c;该方法速度快得多&#xff0c;并且能够适应线性光照变化。与基于…

Vue3setup()的非语法糖和语法糖的用法

1、setup()的语法糖的用法 script标签上写setup属性&#xff0c;不需要export default {} setup() 都可以省 创建每个属性或方法时也不需要return 导入某个组件时也不需要注册 <script setup > // script标签上写setup属性&#xff0c;不需要export default {} set…

Med-YOLO:3D + 医学影像 + 检测框架

Med-YOLO&#xff1a;3D 医学影像 检测框架 提出背景设计思路网络设计训练设计讨论分析 魔改代码&#xff1a;加强小目标检测总结 提出背景 论文链接&#xff1a;https://arxiv.org/abs/2312.07729 代码链接&#xff1a;https://github.com/JDSobek/MedYOLO 提出背景&…

一文梳理Windows自启动位置

不同版本的Windows开机自启动的位置略有出入&#xff0c;一般来说&#xff0c;Windows自启动的位置有&#xff1a;自启动文件夹、注册表子键、自动批处理文件、系统配置文件等。如果计算机感染了木马&#xff0c;很有可能就潜伏于其中&#xff01;本文将说明这些常见的Windows开…

理想架构的非对称高回退Doherty功率放大器理论与仿真

Doherty理论—理想架构的非对称高回退Doherty功率放大器理论与仿真 参考&#xff1a; 三路Doherty设计 01 射频基础知识–基础概念 Switchmode RF and Microwave Power Amplifiers 目录 Doherty理论---理想架构的非对称高回退Doherty功率放大器理论与仿真0、高回退Doherty功率…

UVT音乐证书考试时间确定,学习氛围渐浓

美国职业资格与人才管理中心&#xff08;UVT&#xff09;音乐证书考试时间正式确定&#xff0c;学习氛围逐渐浓厚。众多热爱音乐的从业者和学生开始积极备考&#xff0c;希望通过这一考试获得音乐领域的宝贵证书。音乐证书被认为是音乐人才展示个人专业水平的重要机会&#xff…

【K8S 云原生】K8S的包包管理器-helm

目录 一、helm概念 1、什么是helm 2、helm的概念&#xff1a; 二、实验部署&#xff1a; 1、安装helm&#xff1a; 2、对chart仓库的基本使用&#xff1a; 2.1、查看和更新chart仓库 2.2、安装chart 2.3、卸载chart&#xff1a; 3、helm自定义模版&#xff1a; 3.1、…

常规二分查找中遇到的问题

以前我们写二分查找的时候&#xff0c;是这么写的&#xff1a; public static int binarySearch2(int []a,int target){int i0,ja.length-1;while(i<j){int mid(ij)/2;if(a[mid]target){return mid;}else if(a[mid]<target){imid1;}else {jmid-1;}}return -1;} 这么写&…

签名不对,请检查包名是否与开放平台上填写的一致。微信分享 errorCode 为-6(方法有两种)

微信分享 errorCode 为-6 解决办法1.自己编译&#xff0c;把MD5加密文件改成小写且去掉&#xff1a;如下图 解决方法2 下载GenSignature 输入包名 然后生成应用签名 在微信开放平台创建应用&#xff0c;填写应用签名

74.MySQL 分页原理与优化(下)

文章目录 前言一、一次分页查询的演进二、分页数据在不同页反复出现的坑 前言 上一篇文章介绍了分页原理与优化&#xff1a;73.MySQL 分页原理与优化&#xff08;上&#xff09; 但分页还有一个“坑”需要注意&#xff0c;本文细细道来&#xff0c;可能很多朋友都踩过这个坑还…

REVIT二次开发批量编号

步骤1 步骤2 步骤3 实现代码using System; using System.Collections.Generic; using System.Linq; using Syste

基于springboot+vue的教师工作量管理系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目背景…

Mybatis-Generator-1.4.2

知道代码自动化原理&#xff0c;可以自己搞的&#xff0c;连客户端js html一起弄掉 Low Code Development Platform(LCDP)_cms lcdp-CSDN博客

稀有物种加测bcr/tcr vdj How to create a Cell Ranger compatible V(D)J reference? cellranger

10x官网给出了如下几个答案 How to create a Cell Ranger compatible V(D)J reference? Question: I want to run Cell Rangers V(D)J pipeline on an organism different from human or mouse. How can I create a compatible V(D)J reference? Answer: To generate a Cel…

一种行之有效的防错策略:在支付系统中实施防呆设计的实践

聊个支付人都会碰到的问题&#xff1a;资损防控。做支付如果还没有碰到过资损&#xff0c;那就是做得时间还不够久。资损防控是一个很大的话题&#xff0c;需要开几篇文章才能讲完&#xff0c;今天只从一件小事入手聊一个简单而又行之有效的防错策略&#xff1a;防呆设计的实践…

论文阅读_tinyllama_轻量级大模型

英文名称: TinyLlama: An Open-Source Small Language Model中文名称: TinyLlama: 一个开源的小型语言模型链接: http://arxiv.org/abs/2401.02385v1代码: https://github.com/jzhang38/TinyLlama作者: Peiyuan Zhang, Guangtao Zeng, Tianduo Wang, Wei Lu机构: 新加坡科技与设…

OOM异常

OOM异常详解-CSDN博客 1.什么是OOM&#xff1f; OOM&#xff0c;java.lang.OutOfMemoryError 错误&#xff0c;也就是java内存溢出错误。一般当jvm虚拟机内存不够用的时候&#xff0c;就会抛出该错误。 2.OOM的各种情况

【C++】list容器迭代器的模拟实现

list容器内部基本都是链表形式实现&#xff0c;这里的迭代器实现的逻辑需要注意C语言中指针的转换。 list容器如同数据结构中的队列&#xff0c;通常用链式结构进行存储。在这个容器中&#xff0c;我们可以模仿系统的逻辑&#xff0c;在头结点后设置一个“ 哨兵 ”&#xff0c;…

14.2搭建ASP运行环境

14.2搭建ASP运行环境 可以使用WinXP来搭建ASP的运行环境&#xff0c;不过&#xff0c;WinXP不适宜作为商业用Web服务器。目前比较常用的Web服务器操作系统是Windows2003 Server&#xff0c;在Windows2003 Server上安装完IIS6.0并进行相关设置后&#xff0c;即完成了ASP运行环境…