【C++中的STL】函数对象

函数对象

  • 函数对象概念
  • 谓词
    • 概念
  • 内建函数对象
    • 算术仿函数
    • 关系仿函数
    • 逻辑仿函数(基本用不到)

函数对象概念

重载函数调用操作符的类,其对象常称为函数对象,函数对象使用重载的()时。行为类似函数调用,也叫仿函数。
函数对象(仿函数)是一个类,不是一个函数。
使用特点:
函数对象在使用时,可以像普通函数那样调用,可以有参数,可以有返回值。函数对象超出普通函数的概念,函数对象可以有自己的状态,函数对象可以作为参数传递。

//函数对象在使用时,可以像普通函数那样调用,可以有参数,可以有返回值。
class myAdd {
public:
	int operator()(int a, int b) {
		return a + b;
	}
};
//函数对象超出普通函数的概念,函数对象可以有自己的状态
class B {
public:
	int count;//内部自己的状态
	B(){
		count = 0;
	}
	void operator()(string s) {
		cout << s << endl;
		this->count++;
	}

};
//函数对象可以作为参数传递
void doP(B& b1, string b2) {
	b1(b2);
}
void test() {
	myAdd ma;
	cout << ma(10, 10) << endl;
	B b2;
	b2("dasfafasfg");
	b2("dasfafasfg");
	b2("dasfafasfg");
	b2("dasfafasfg");
	cout << "次数:" << b2.count << endl;

	B b3;
	doP(b3, "C++");
}

在这里插入图片描述

谓词

概念

返回bool类型的仿函数称为谓词,如果operator()接受一个参数,叫做一元谓词;如果operator()接受两个参数,叫做二元谓词。
一元谓词:
在这里插入图片描述

class CreateN {
public:
	bool operator()(int val) {
		return val > 5;
	}
};
void test() {
	vector<int> v;
	for (int i = 0;i < 5;i++) {
		v.push_back(i);
	}
	//查找容器中有没有大于5的数字,CreateN()匿名函数对象
	vector<int>::iterator it=find_if(v.begin(), v.end(), CreateN());
	if (it == v.end()) {
		cout << "没找到" << endl;
	}
	else {
		cout << "找到" << endl;
	}
}

二元谓词

class myCom {
public:
	bool operator()(int v, int v1) {
		return v > v1;
	}
};
void test() {
	vector<int> v;
	v.push_back(10);
	v.push_back(24);
	v.push_back(12);
	v.push_back(35);
	v.push_back(20);
	sort(v.begin(),v.end());
	for (vector<int>::iterator it = v.begin();it != v.end();it++) {
		cout << *it << endl;
	}
	cout << "---------------------" << endl;
	//使用函数对象改变算法规则,从大到小
	sort(v.begin(), v.end(),myCom());
	for (vector<int>::iterator it = v.begin();it != v.end();it++) {
		cout << *it << endl;
	}
}

在这里插入图片描述

内建函数对象

STL内建了一些函数对象,有算术仿函数、关系仿函数、逻辑仿函数,这些仿函数所产生的对象,用法和一般函数完全相同,使用内建函数对象,需要引入头文件**#include**

算术仿函数

实现四则运算,其中negate是一元运算,其他都是二元运算。
仿函数原型

1、template<class T> T plus < T >加法仿函数
2、template<class T> T minus < T >减法仿函数
3、template<class T> T multiplies < T >乘法仿函数
4、template<class T> T divides < T >除法仿函数
5、template<class T> T modulus < T >取模仿函数
6、template<class T> T negate < T >取反仿函数

void test() {
	//取反仿函数(一元用法)
	negate<int> n;
	cout << n(50) << endl;
	//加法仿函数(二元用法)
	plus<int> p;
	cout << p(10, 34) << endl;
}

关系仿函数

实现关系对比
仿函数原型
1、template<class T> T bool equal_to< T >等于
2、template<class T> T bool not_equal_to< T >不等于
3、template<class T> T bool greater< T >大于(最常用)
4、template<class T> T bool greater_equal< T >大于等于
5、template<class T> T bool less< T >小于
6、template<class T> T bool less_equal< T >小于等于

void test() {
	...
	for (vector<int>::iterator it = v.begin();it != v.end();it++) {
		cout << *it << "   ";
	}
	cout << endl;
	//降序  greater<int>()内建函数对象,和自己实现的仿函数效果一样
	sort(v.begin(), v.end(), greater<int>());
}

逻辑仿函数(基本用不到)

1、template<class T> T bool logical_and< T >逻辑与
2、template<class T> T bool logical_or< T >逻辑或
3、template<class T> T bool logical_not< T >逻辑非

void test() {
	....
	cout << endl;
	cout << "-----------------------------------------" << endl;
	//利用逻辑非,将容器v搬运到容器v1中,并执行取反操作
	vector<bool>v1;
	v1.resize(v.size());
	transform(v.begin(), v.end(), v1.begin(),logical_not<bool>());//搬运,必须要开辟不骗空间才可使用
	for (vector<bool>::iterator it = v1.begin();it != v1.end();it++) {
		cout << *it << "   ";
	}
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Element table组件内容\n换行

漂亮的页面总是让人心旷神怡&#xff0c;层次清晰的页面让用户操作起来也是易于上手及展示。 如下的页面展示就是非常low的&#xff1a;用户根本阅读其中的数据。 在这个页面&#xff0c;根据用户填写过程生成多次填写记录&#xff0c;如果不进行层次性的展示&#xff0c;数据…

Nestjs 异常拦截器

一、异常拦截器 目标&#xff1a;访问路径不存在时&#xff0c;返回结果中包含请求路径path 实现&#xff1a;1、创建一个异常过滤器&#xff0c;负责将捕获作为HttpException类实例的异常 2、访问底层平台Request、Response&#xff0c;通过访问Request对象&#xff0c;提取原…

微信小程序-04

rpx&#xff08;responsive pixel&#xff09;是微信小程序独有的&#xff0c;用来解决屏适配的尺寸单位。 import 后跟需要导入的外联样式表的相对路径&#xff0c;用 ; 表示语句结束。 定义在 app.wxss 中的样式为全局样式&#xff0c;作用于每一个页面。 在页面的 .wxss 文…

竞赛练一练 第30期:GESP和电子学会相关题目练习

Day14&#xff1a;CIE一级2022.06_报时的公鸡 故事背景&#xff1a;公鸡在黎明时分会打鸣迎接太阳升起&#xff0c;古人也将鸡鸣声当做晨起的“闹钟”。 1. 准备工作 &#xff08;1&#xff09;背景&#xff1a;根据下图绘制两张背景&#xff1b; 01 02 &#xff08;2&…

第5章 (python深度学习——波斯美女)

第5章 深度学习用于计算机视觉 本章包括以下内容&#xff1a; 理解卷积神经网络&#xff08;convnet&#xff09; 使用数据增强来降低过拟合 使用预训练的卷积神经网络进行特征提取 微调预训练的卷积神经网络 将卷积神经网络学到的内容及其如何做出分类决策可视化 本章将…

仰暮计划|“她就是用她的一双小脚把我们兄弟姐妹几个拉扯大的”

在残存的一些老物件中&#xff0c;在一些泛黄的相片中&#xff0c;掩藏着岁月的冲刷和青葱的时光。曾经无忧无虑的少女早已白发苍苍&#xff0c;不复青春貌美&#xff1b;曾经在父母面前笑闹的孩子早已变成他人眼中的长辈。 ——题记 她的身影也许并不高大&#xff0c;甚至还略…

Windows11 鼠标拖动文件到CMD控制终端窗口无效,无法显示具体文件路径

对于某些用户来说&#xff0c;他们可能会在Windows 11上遇到鼠标拖动文件到CMD控制终端时&#xff0c;无法显示具体文件路径的情况。 系统更新&#xff0c;习惯基础操作无效了&#xff0c;真的有点烦&#xff0c;不会提问就无计可施。 果然善于提问&#xff0c;才有果子吃 问…

Linux-动静态库

背景 在实践中&#xff0c;我们一定会使用别人的库&#xff08;不限于C、C的库&#xff09;&#xff0c;在实践中&#xff0c;我们会使用成熟、被广泛使用的第三方库&#xff0c;而不会花费很多时间自己造轮子&#xff0c;为了能更好地使用库&#xff0c;就要在学习阶段了解其…

jenkins+gitlab实现Android自动打包填坑之旅

一.背景 1.首先你需要知道你想要实现的Android自动打包的Android项目的一些环境配置及需要使用的一些开发版本。 声明&#xff1a;本文 Android项目基于&#xff1a;1.jdk11 2.SDK无要求 3.gradle无要求&#xff08;同Manven一样为项目自动化构建开源工具&#xff09; 注&am…

【控制算法笔记】卡尔曼滤波(二)——基于状态空间表达的KF基本计算流程以及Python实现

本文是个人学习笔记&#xff0c;包含个人理解&#xff0c;如有错误欢迎指正。 KF算法更多的情况下会用来处理复杂的非线性数据&#xff0c;尤其是当对象特征或检测的状态量不止一个时就得使用状态方程的方法&#xff0c;利用线性代数的计算方式来解决噪声的估计问题。这其中涉及…

C++实现满天星效果静态图片

用编程C实现随机生成不同效果的星星&#xff0c;实现看星星的效果图片&#xff0c;借助EasyX图形化工具!!! 在vs2019中新建文件夹&#xff0c;并且注意在项目目录下保存两张小人的抬头观看背景的图片 将下面代码粘贴进去实现效果&#xff1a; #define _CRT_SECURE_NO_WARNIN…

前端canvas项目实战——简历制作网站(三)——右侧属性栏(线条宽度样式)

目录 前言一、效果展示二、实现步骤1. 实现线条宽度&#xff08;strokeWidth&#xff09;的属性模块2. 实线线条样式&#xff08;strokeDashArray&#xff09;的属性模块3. 意料之外的“联动” 三、Show u the code后记 前言 上一篇博文中&#xff0c;我们初步实现了右侧属性栏…

IDEA 创建maven项目没有src

环境&#xff1a; IntelliJ IDEA 2022.3.3 (Ultimate Edition) JDK 17 Windows 11 10.0 Maven 3.9.5 创建maven项目的时候没有src目录 试过网上说的重新配置maven库&#xff0c;增加vm-options&#xff0c;并没有什么用。直到我看见了 正常创建就好了。

QoS服务质量

内存QoS——服务质量&#xff08;Quality of Service&#xff09; 作用&#xff1a;如果不开启QoS&#xff0c;会通过内存复用技术&#xff0c;动态调整虚拟机的资源&#xff0c;如果说有一台跑核心业务&#xff0c;然后通过QoS技术&#xff0c;通过限额&#xff0c;预留&…

思考,是世界上最有趣的事

经常有读者问我&#xff1a; 你总说我们要多思考&#xff0c;可是每天的生活就那样&#xff0c;究竟要怎么思考&#xff0c;思考什么呢&#xff1f; 跟大家分享我上周日的一天&#xff1a; 读完一篇推理小说&#xff0c;写了一篇书评发给作者&#xff0c;并跟作者聊了聊写作的…

vivado 配置I/O端口

配置I/O端口 AMD设备支持可配置的SelectIO™ 接口驱动程序和接收器&#xff0c;支持各种标准接口。这些标准接口包括输出的可编程控制强度和转换速率&#xff0c;使用DCI的片上终端&#xff0c;以及内部VREF的生成。你可以配置一个或多个I/O端口以定义I/O标准、驱动器强度、转…

LaTeX基础使用【系列四】

&#x1f308;个人主页&#xff1a;godspeed_lucip &#x1f525; 系列专栏&#xff1a;LaTeX基础使用 &#x1f984;1 LaTeX的多行数学公式&#x1f420;1.1 导入包&#x1f420;1.2 gather环境&#xff1a;多行公式&#x1f420;1.3 gather\* &#xff1a;无编号公式&#x1…

【Javaweb程序】【C00156】基于SSM餐饮管理系统(论文+PPT)

基于SSM餐饮管理系统&#xff08;论文PPT&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于ssm的餐饮管理系统 本系统分为前台用户模块和后台管理员模块 其中前台用户模块的权限&#xff1a;当游客打开系统的网址后&#xff0c;首先看到的就是首页…

Day01_Java概述(JDK的下载安装,初学者常见错误)

文章目录 JavaSE_Day01 Java概述学习目标1.1 JavaSE课程体系介绍1.2 计算机语言概述1、计算机语言是什么2、计算机语言发展3、计算机语言分类4、计算机语言排行榜 1.3 Java语言概述1、Java语言发展历史2、Java是最好的语言吗&#xff1f;3、Java语言的特点4、Java生态圈5、Java…

【MySQL】学习如何通过DML更新数据库的数据

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-QIqURn9fNFMjLD9l {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…