STL-函数对象

news2024/10/7 18:23:02

目录

一、函数对象

1、基本概念

2、使用

二、谓词

1、基本概念

2、一元谓词

3、二元谓词

三、内建函数对象

1、基本概念

2、算数仿函数

3、关系仿函数

4、逻辑仿函数


一、函数对象

1、基本概念

概念:

①重载函数调用操作符的,其对象常称为函数对象

②函数对象使用重载的()时,行为类似函数调用,也叫仿函数

本质:

函数对象(仿函数)本身是一个类,并非一个函数


2、使用

特点:

①函数对象在使用时 ,可以像普通函数那样调用,可以有参数与返回值

②函数对象超出普通函数的概念,可以有自己的状态

③函数对象可以作为参数传递

测试:

①仿函数MyAdd

class MyAdd
{
public:
	int operator()(int x,int y)
	{
		return x + y;
	}
};

test函数,直接调用普通函数那样调用

void test01()
{
	MyAdd myadd;
	cout << myadd(1, 5) << endl;
}

 ②仿函数MyPrint,内有属性count来记录自己状态

class MyPrint
{
public:
	MyPrint()
	{
		this->count = 0; // 初始化为0
	}
	void  operator()(string s)
	{
		cout << s << endl;
		this->count++;
	}
	int count; // 记录自己状态
};

test函数,调用多次MyPrint函数

void test02()
{
	MyPrint myprint;
	myprint("Jocye is my ba");	myprint("Jocye is my ba");
	myprint("Jocye is my ba");	myprint("Jocye is my ba");
	cout << myprint.count << endl;
}

 ③doPrint函数

void doPrint(MyPrint& mp,string s) // mp作为一个参数进行传递
{
	mp(s); // 同时还能使用自身来打印s
}

test函数,我们调用doPrint函数

void test03()
{
	MyPrint myprint;
	doPrint(myprint, "Hello my");
}


二、谓词

1、基本概念

概念:返回bool类型的仿函数称为谓词

如果operator()接受一个参数,称为一元谓词

如果operator()接受两个参数,称为二元谓词

2、一元谓词

void test04()
{
	vector <int> v;
	int i = 10;
	while (i--)
	{
		v.push_back(i);
	}
	// 上面GreateFive仿函数,正常应该先创建一个对象,下面再使用
	// 这里我直接使用匿名对象GreateFive();
	vector<int>::iterator it = find_if(v.begin(), v.end(), GreateFive());
	if (it != v.end())
		cout << "有了:" << *it;
	else
		cout << "没有" << endl;
}
int main

   // find_if(起始迭代器,终止迭代器,仿函数); 
    //返回的也是个迭代器,找到返回所在位置迭代器,否则返回end(); 

仿函数GreateFive(),大于5返回真

class GreateFive
{
public:
	bool operator()(int val)
	{
		return val > 5;
	}
};

由于是从9加进去,加到1,因此第一个数9就满足,返回 

3、二元谓词

void test05()
{
	vector<int> v;
	v.push_back(10);	v.push_back(40);	v.push_back(20);
	v.push_back(30);	v.push_back(50);	v.push_back(60);
	sort(v.begin(),v.end());
	printv(v);

	// 使用函数对象MyCompare()使其实现降序
	sort(v.begin(), v.end(), MyCompare());
	printv(v);
}

二元谓词MyCompare

class MyCompare
{
public:
	bool operator()(int x, int y) // 二元谓词,2个参数
	{
		return x > y;
	}
};

打印函数printv()

// 二元谓词
void printv(vector<int>& v)
{
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}


三、内建函数对象

1、基本概念

首先,STL内建了一些函数对象(仿函数)

分类:算数仿函数、关系仿函数、逻辑仿函数

使用:

①这些仿函数所产生的对象,用法与一般函数完全相同

②使用内建函数对象,需要引用头文件#include<functional>

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>	 取反
*/

其中negate是一元运算,其他都是二元运算

测试:

①取反仿函数

void test06()
{	
	negate<int> n;
	cout << n(50) << endl;
}

 ②加法仿函数

void test07()
{
	plus<int> p; // 默认传同种数据类型
	cout << p(5,10) << endl;
}

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

测试:

在此之前,我们创建vector容器里面存入数据,如果想让数据降序排序,需要自己实现仿函数

void test08()
{
	vector<int> v;
	v.push_back(10);	v.push_back(40);	v.push_back(20);
	v.push_back(30);	v.push_back(50);	v.push_back(60);
	sort(v.begin(), v.end());
	printv(v);

	// 使用函数对象MyCompare()使其实现降序
	sort(v.begin(), v.end(), MyCompare());
	printv(v);
}

此时,我们使用内建函数greater

// 使用内建函数对象
	sort(v.begin(), v.end(), greater<int>());

而若是想比较其他的数据,如float,我们只需要修改为greater<float>();即可 


同时,greater是比较常用的

我们打开sort排序源码

 

可以发现,如果要重载,上面有3个参数,而下面默认的只有2个参数(起始和终止区间)

 而默认的2个参数的,调用的是less<>,因此默认使用升序排序从小到大


 4、逻辑仿函数

功能:实现逻辑运算

函数:

/*逻辑仿函数
template<class T> bool logical_and<T>	逻辑与,同时为真才真,其余为假
template<class T> bool logical_or<T>	逻辑或,同时为假才假,其余为真
template<class T> bool logical_not<T>	逻辑非,取反操作
*/

测试:创建容器v和容器v2,v中存入true与false的数据,取反后存入v2

void test09()
{
	vector<int > v;
	v.push_back(true);	v.push_back(false);	v.push_back(true);
	v.push_back(true);	v.push_back(false);
	printv(v);

	// 取反,放入另一个容器
	vector<int> v2;
	v2.resize(v.size()); // 指定v2的size为v的size
	transform(v.begin(), v.end(), v2.begin(),logical_not<int>());
	//搬运算法	 起始      终止    目标的起始   逻辑非
	printv(v2);
}

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

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

相关文章

关于Sql 中 on和where的粗略理解

先看到题&#xff1a;统计复旦用户8月练题情况 牛客中的 原地址 通过这个题我们来探讨where和on 描述 题目&#xff1a; 现在运营想要了解复旦大学的每个用户在8月份练习的总题目数和回答正确的题目数情况&#xff0c;请取出相应明细数据&#xff0c;对于在8月份没有练习过的…

【Ansys Fluent】All cell zones in Fluent may be automatically set to Fluid.

一、问题背景 在ansys meshing中保存划分完网格之后的结果时&#xff0c;弹出警报——All cell zones in Fluent may be automatically set to Fluid. 如果你忽视这个警报&#xff0c;打开fluent时。 接着就会将你想要设置为solid的区域识别成flow&#xff0c;从而生成一些错…

docker4_创建容器

docker4_搭建hadoop集群 1集群规划进入容器base_centos 2创建容器创建三个docker容器&#xff0c;分别作为三个结点(注意端口的设置)gpb_hdp_node3 容器gpb_hdp_node2 容器删除容器查看已经创好的容器gpb_hdp_node1容器&#xff08;最后创建&#xff09;问题1:容器名和 hostnam…

代码随想录算法训练营第十六天 | 104.二叉树的最大深度 559.n叉树的最大深度,111.二叉树的最小深度,222.完全二叉树的节点个数

代码随想录算法训练营第十六天 | 104.二叉树的最大深度 559.n叉树的最大深度&#xff0c;111.二叉树的最小深度&#xff0c;222.完全二叉树的节点个数 1.1 104.二叉树的最大深度 思路&#xff1a; 采用后序遍历确定递归函数的参数和返回值&#xff0c;确定终止条件&#xff…

AJAX 教程---菜鸟教程

文章目录 AJAX 简介AJAX 实例XHR 创建对象XHR 请求向服务器发送请求GET 还是 POST&#xff1f;GET 请求POST 请求url - 服务器上的文件 XHR 响应responseText 属性responseXML 属性 XHR readyState使用回调函数 AJAX 简介 AJAX 是一种在无需重新加载整个网页的情况下&#xff0…

CTR预估之DNN系列模型:FNN/PNN/DeepCrossing

前言 在上一篇文章中 CTR预估之FMs系列模型:FM/FFM/FwFM/FEFM&#xff0c;介绍了FMs系列模型的发展过程&#xff0c;开启了CTR预估系列篇章的学习。FMs模型是由线性项和二阶交互特征组成&#xff0c;虽然有自动学习二阶特征组合的能力&#xff0c;一定程度上避免了人工组合特征…

【Springboot】集成百度地图实现定位打卡功能

目录 第一章 需求分析 第二章 概要设计 第三章 详细设计 3.1 环境搭建 3.1.1 获取百度地图ak 3.1.2 创建springboot项目 3.2 配置application.properties 3.3 配置pox.xml 3.4 创建定位接口 3.5 创建前端页面 3.6 映射静态文件 第一章 需求分析 如图&#xff0c;当…

BERT论文核心点记录

BERT适合分类任务&#xff08;整段分类后者词分类&#xff09;&#xff0c;对生成任务不友好 使用BERT的方法&#xff1a;只需要在预训练好的BERT基础上新增一个输出层&#xff0c;然后用标记好的数据进行有监督微调 Bidirectional Encoder双向Encoder实质上就是指Transforme…

【分享】用java和pathon实现小红书(Red Booklet)客服自动回复功能、技术实现分析

技术栈&#xff1a;python、java、android&#xff0c;进程管理、socket通信 客户需求&#xff1a; 客户需要在Red Booklet平台做一个可以24小时自动回复用户私信、评论、回关用户等行为的客服软件。他说他们公司有50个小红书号&#xff0c;十几个客服&#xff0c;急需一款代…

正则表达式和文本三剑客题型练习

​ 1、显示/etc/passwd文件中以bash结尾的行&#xff1b; 解释&#xff1a;使用 grep 工具来搜索文件 /etc/passwd 中匹配模式 bash$ 的行。bash$ 是一个正则表达式&#xff0c;其中 $ 表示行结尾。因此&#xff0c;bash$ 匹配以 bash 结尾的行。 grep bash$ /etc/passwd 运…

四元数转换为欧拉角(多解问题)

车辆行驶状态估计&#xff08;4&#xff09;中车辆横摆角信息在顺时针转向时存在明显的错误&#xff0c;进行记录输出 2023-05-25-aft02.txt 四元数&#xff1a; -0.00201210.00115721 -0.0005967610.999997 欧拉角&#xff1a;3.14039四元数&#xff1a; -0.00170584 -0.00…

RabbitMQ(2)、MQ的问题、消息可靠性

一、MQ的问题 基于上篇存在的问题 1. 问题说明 MQ在分布式项目中是非常重要的&#xff0c; 它可以实现异步、削峰、解耦&#xff0c;但是在项目中引入MQ也会带来一系列的问题。 今天我们要解决以下几个常见的问题&#xff1a; 消息可靠性问题&#xff1a;如何确保消息被成功送…

MySQL — SQL 优化

文章目录 SQL 优化一、插入数据二、主键优化2.1 数据组织方式2.2 页分裂2.3 页合并2.4 主键设计原则 三、 Order by 优化3.0 排序方式讲解3.1 升序/降序联合索引结构图示3.2 总结 四、Group by优化五、limit优化六、 count优化七、update优化七、update优化 SQL 优化 一、插入…

【MySQL 数据库】5、存储引擎

目录 一、MySQL 体系结构二、存储引擎简介三、InnoDB 存储引擎四、MyISAM五、Memory六、三大存储引擎比较七、存储引擎的选择 一、MySQL 体系结构 连接层 最上层是一些客户端和链接服务&#xff0c;包含本地sock 通信和大多数基于客户端/服务端工具实现的类似于TCP/IP的通信。主…

07:MYSQL----多表查询

目录 1:多表查询概述 2:多表查询分类 3:内连接 3:外连接 4:自连接 5:联合查询-union&#xff0c;union all 6:子查询 1:多表查询概述 select * from emp , dept; emp:表中有6条数据, dept表中有5条数据只查询出来的数据为:30条 概述:指从多张表中查询数据 笛卡尔积…

在vite或者vue-cli中使用.env[mode]环境变量

在项目中总会遇到一些默认的配置,需要我们配置到静态文件中方便我们去获取,这时候就可以用到这个.env环境变量文件,在cli创建的项目中顶层的nodejs会有一个process对象,这个对象可以根据不同的环境获取不同的环境配置文件,但是vite中获取变量的方式不一样。 创建变量文件.env.…

如何编写接口自动化框架系列之requests详解(三)

目录 1.http协议 2.requests介绍 3.requests的主要功能 3.requests的主要功能 3.1 场景1-常用方法 3.2 场景2-通用方法 3.3 场景3-cookies认证方式 4.requests 在项目中的实践 4.1 在接口层实现一个接口 4.2 在测试用例层调用 4.3 项目总结 本文是接口自动化测试框架…

IOC初始化 IOC启动阶段 (Spring容器的启动流程)

[toc](IOC初始化 IOC启动阶段 (Spring容器的启动流程)) IOC初始化 IOC启动阶段 (Spring容器的启动流程) Resource定位过程&#xff1a;这个过程是指定位BeanDefinition的资源&#xff0c;也就是配置文件&#xff08;如xml&#xff09;的位置&#xff0c;并将其封装成Resource对…

Makefile基础教程(make的隐式规则)

文章目录 前言一、什么是make的隐式规则二、makefile中出现同名目标时三、一些常见的隐式规则四、查看隐式规则五、隐式规则缺点六、禁用隐式规则1.全局禁用2.局部禁用 总结 前言 本篇文章将给大家介绍make的隐式规则。 一、什么是make的隐式规则 Make 的隐式规则是指 Make …

css选择器及其权重

1. 类型选择器 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-wid…