C++核心编程和桌面应用开发 第十八天(一元/二元谓词 内建函数对象 算术/关系/逻辑仿函数 函数适配器/取反适配器/函数指针适配器/成员函数适配器)

目录

1.函数对象

1.1函数对象特点

2.谓词

2.1一元谓词

2.2二元谓词

3.内建函数对象

3.1算术仿函数

3.2关系仿函数

3.3逻辑仿函数

4.函数适配器

5.取反适配器

5.1一元取反适配器

5.2二元取反适配器

6.函数指针适配器

7.成员函数适配器


1.函数对象

概念:重载函数调用操作符的类,其对象称为函数对象

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

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

1.1函数对象特点

  • 函数对象可以有自己的状态;
  • 可以作为参数传递。

2.谓词

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

若仿函数或函数参数只有一个,那么是一元谓词

若仿函数或函数参数有两个,那么是二元谓词

2.1一元谓词

//创建仿函数
class GreaterFive
{
public:
	bool operator()(int val)
	{
		return val > 5;
	}
};

//向vector中增加10个数据
vector<int> v;
for (int i = 0; i < 10; i++)
{
	v.push_back(i);
}

//查找vector中大于5的数的位置
vector<int>::iterator result = find_if(v.begin(), v.end(), GreaterFive());

2.2二元谓词

//定义仿函数,降序排序
class MySort
{
public:
	bool operstor(int v1, int v2)
	{
		return v1 > v2;
	}
};

//向vector中塞五个数据
vector<int> v;
for (int i = 0; i < 5; i++)
{
	v.push_back(i);
}

//把vector中的数据按照降序排列
sort(v.begin(), v.end(), MySort());

3.内建函数对象

概念:STL内建了一些函数对象,可以直接使用,需要引入#include<functional>,内建函数对象和普通函数对象用法一样

内建函数对象分类:

  1. 算术仿函数
  2. 关系仿函数
  3. 逻辑仿函数

3.1算术仿函数

算术仿函数实现的是四则运算,negate是一元运算,其他都是二元运算

仿函数原型:

negate<int> n;
cout << n(10);//取反,输出-10

plus<int> p;
cout << p(10, 20);//10+20=30,输出30

3.2关系仿函数

关系仿函数实现关系对比

仿函数原型:

//向vector中塞五个数据
vector<int> v;
for (int i = 0; i < 5; i++)
{
	v.push_back(i);
}

//把vector中的数据按照降序排列
sort(v.begin(), v.end(), greater<int>());

3.3逻辑仿函数

逻辑仿函数实现逻辑运算

4.函数适配器

适配器:让原本接口不兼容的类可以合作无间

//仿函数,输出数值
class MyOut
{
	void operator()(int num) 
	{
		cout << num << endl;
	}
};

void test01()
{
	//数组里塞十个数
	vector<int> v;

	for (int i = 1; i < 10; i++)
	{
		v.push_back(i);
	}

	//利用仿函数遍历数组
	for_each(v.begin(), v.end(), MyOut());
}

函数适配器使用步骤:

  1. 绑定bind2nd(将函数对象和参数绑定起来)
  2. 继承binary_function<参数类型1,参数类型2,返回值类型>
  3. 加const,让operator()变为常函数

注意:

  1. bind1st将绑定的参数作为operator()中的第一个参数
  2. bind2nd将绑定的参数作为operator()中的第二个参数
//继承binary_function<参数类型1,参数类型2,返回值类型>
class MyOut:public binary_function<int,int,void>
{
	//加const,让operator()变为常函数
	void operator()(int num, int start) const
	{
		cout << num + start << endl;
	}
};

void test01()
{
	//数组里塞十个数
	vector<int> v;

	for (int i = 1; i < 10; i++)
	{
		v.push_back(i);
	}

	cout << "请输入起始值";
	int start;
	cin >> start;

	//绑定bind2nd
	for_each(v.begin(), v.end(), bind2nd(MyOut(),start));
}

5.取反适配器

5.1一元取反适配器

//仿函数,找出第一个大于5的数	
class MyOperator
{
public:
	bool operator()(int a)
	{
		return a > 5;
	}
};

//数组里塞十个数
vector<int> v;

for (int i = 0; i < 10; i++)
{
	v.push_back(i);
}

//返回数组中第一个大于5的数的位置
vector<int>::iterator it = find_if(v.begin(), v.end(), MyOperator());

 

一元取反适配器操作步骤:

  1. not1取反
  2. 继承unary_function<参数类型,返回值类型>
  3. 加const变为常函数
//一元取反适配器
	
//继承unary_function<参数类型,返回值类型>
class MyOperator:public unary_function<int,bool>
{
public:
	//加const变为常函数
	bool operator()(int a) const
	{
		return a > 5;
	}
};

vector<int> v;

for (int i = 0; i < 10; i++)
{
	v.push_back(i);
}

//not1取反,返回小于5的数的位置
vector<int>::iterator it = find_if(v.begin(), v.end(), not1(MyOperator()));

5.2二元取反适配器

二元取反适配器操作步骤:not2

//回调函数,输出数字
void myPrint(int a)
{
	cout << a << endl;
}

void test02()
{
	//数组里塞十个数
	vector<int> v;

	for (int i = 0; i < 10; i++)
	{
		v.push_back(i);
	}

	//升序,not2降序排列
	sort(v.begin(), v.end(), not2(less<int>()));
	//回调函数输出数字
	for_each(v.begin(), v.end(), myPrint);
}

6.函数指针适配器

作用:ptr_fun将函数指针适配成函数对象

//回调函数,输出数字加上起始累加数字
void myPrint(int num,int start)
{
	cout << num + start << endl;
}

void test02()
{
	//数组里塞十个数
	vector<int> v;

	for (int i = 1; i < 10; i++)
	{
		v.push_back(i);
	}

	cout << "请输入起始值";
	int start;
	cin >> start;

	//利用ptr_fun将函数指针适配成函数对象
	for_each(v.begin(), v.end(), bind2nd(ptr_fun(myPrint),start));
}

7.成员函数适配器

mem_func是将成员函数入口地址,适配成全局函数

注意:

  1. 若容器中存放的是对象,成员函数适配器用mem_func_ref
  2. 若容器中存放的是对象指针,成员函数适配器用mem_func
class Person
{
public:
	Person(string name, int age)
	{
		m_name = name;
		m_age = age;
	}

	//成员函数
	void showPerson()
	{
		cout << m_name << endl;
		cout << m_age;
	}

	string m_name;
	int m_age;
};

//全局函数
void showPerson(Person& p)
{
	cout << p.m_name << endl;
	cout << p.m_age;
}

void test03()
{
	//创建有5个Person的vector
	vector<Person> VP;
	Person p1("aaa", 10);
	Person p2("bbb", 20);
	Person p3("ccc", 30);
	Person p4("ddd", 40);
	Person p5("eee", 50);

	VP = { p1,p2,p3,p4,p5 };
	
	//利用全局函数输出对象信息
	for_each(VP.begin(), VP.end(), showPerson);
	//利用成员函数输出对象信息
	for_each(VP.begin(), VP.end(), mem_fun_ref(&Person::showPerson));
}

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

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

相关文章

Java后端面试内容总结

先讲项目背景&#xff0c;再讲技术栈模块划分&#xff0c; 讲业务的时候可以先讲一般再特殊 为什么用这个&#xff0c;好处是什么&#xff0c;应用场景 Debug发现问题/日志发现问题. QPS TPS 项目单元测试&#xff0c;代码的变更覆盖率达到80%&#xff0c;项目的复用性高…

P3-2.【结构化程序设计】第二节——知识要点:多分支选择语句

讲解视频&#xff1a; P3-2.【结构化程序设计】第二节——知识要点&#xff1a;多分支选择语句 知识要点&#xff1a;多分支选择语句 一、任务分析 已知某公司员工的保底薪水为500&#xff0c;某月销售商品的利润profit(整数)与利润提成的关系如下(单位&#xff1a;元)&#…

关于Android Studio Koala Feature Drop | 2024.1.2下载不了插件的解决办法

解决 androidStudio Settings->Plugins下载插件&#xff0c;点击install后没反应&#xff0c;同时插件描述相关显示不出来 第一步&#xff1a; 第二步&#xff1a; 点击设置&#xff0c;勾选Auto-detect proxy settings&#xff0c;输入网址 https://plugins.jetbrains.com…

UE中查“资源包因何变脏”的方式

“脏”&#xff08;Dirty&#xff09;的意思 当用户对一个资源包&#xff08;关卡&#xff0c;或材质等美术资源&#xff09;做出了修改&#xff0c;变得与磁盘上存储的内容有差异时&#xff0c;UE会对其“标脏”&#xff08;Mark Dirty&#xff09;&#xff0c;显示为 * 符号…

leetcode 2710 移除字符串中的尾随零

1.题目要求: 2.题目代码: class Solution { public:string removeTrailingZeros(string num) {while(num[num.size() - 1] 0){num.pop_back();}return num;} };

Iceoryx2:高性能进程间通信框架(中间件)

文章目录 0. 引言1. 主要改进2. Iceoryx2 的架构3. C示例代码3.1 发布者示例&#xff08;publisher.cpp&#xff09;3.2 订阅者示例&#xff08;subscriber.cpp&#xff09; 4. 机制比较5. 架构比较6. Iceoryx vs Iceoryx2参考资料 0. 引言 Iceoryx2 是一个基于 Rust 实现的开…

10.30.2024刷华为OD

文章目录 HJ20 密码验证合格程序&#xff08;难过全部例子 list取数左开有闭 [0,3) &#xff09;HJ21 简单密码HJ22 汽水瓶 (数学游戏...)HJ23 (dic就是map&#xff0c;注意怎么用&#xff0c; 善用values()和keys()函数返回list)语法知识记录 (留意转换的字符怎么拼接) HJ20 密…

【问题记录】解决VMware虚拟机中鼠标侧键无法使用的问题

前言 有项目需要在Linux系统中开发&#xff0c;因为要测试Linux中相关功能&#xff0c;要用到shell&#xff0c;在Windows中开发太麻烦了&#xff0c;因此我选择使用UbuntuXfce4桌面来开发&#xff0c;这里我用到了Linux版本的IDEA&#xff0c;除了快捷键经常和系统快捷键冲突…

【337】基于springboot的校园失物招领系统

校园失物招领网站的设计与实现 摘要 近年来&#xff0c;信息化管理行业的不断兴起&#xff0c;使得人们的日常生活越来越离不开计算机和互联网技术。首先&#xff0c;根据收集到的用户需求分析&#xff0c;对设计系统有一个初步的认识与了解&#xff0c;确定校园失物招领网站…

彻底理解链表(LinkedList)结构

目录 比较操作结构封装单向链表实现面试题 循环链表实现 双向链表实现 链表&#xff08;Linked List&#xff09;是一种线性数据结构&#xff0c;由一组节点&#xff08;Node&#xff09;组成&#xff0c;每个节点包含两个部分&#xff1a;数据域&#xff08;存储数据&#xff…

使用Docker Compose搭建多服务应用

使用Docker Compose搭建多服务应用 Docker Compose简介 安装Docker Compose 在Linux上安装Docker Compose 在macOS上安装Docker Compose 在Windows上安装Docker Compose 创建项目结构 Flask应用 安装依赖 Dockerfile 配置Docker Compose 构建和运行应用 访问应用 高级配置 环…

LLaMA系列一直在假装开源...

伙伴们&#xff0c;很奇怪~ 关于LLM的开源与闭源模型的竞争又开始愈发激烈。 众所周知&#xff0c;开源模型以其开放性和社区驱动的特点受到一部分用户的青睐&#xff0c;而闭源模型则因其专业性和性能优化被广泛应用于商业领域。由于大模型最近2年的突然兴起&#xff0c;开源…

i2c与从设备通讯编程示例之开发板测试

编译elf1_cmd_i2c程序 &#xff08;一&#xff09;设置交叉编译环境 &#xff08;二&#xff09;查看elf1_cmd_i2c文件夹Makefile文件。查看当前编译规则&#xff0c;i2c_demo是编译整个工程&#xff0c;clean是清除工程。 &#xff08;三&#xff09;在03_elf1_cmd_i2c文件夹…

开源办公软件 ONLYOFFICE 深入探索

文章目录 引言1. ONLYOFFICE 创建的背景1. 1 ONLYOFFICE 项目启动1. 2 ONLYOFFICE 的发展历程 2. 核心功能介绍2. 1 桌面编辑器2. 1. 1 文档2. 1. 2 表格2. 1. 3 幻灯片 2. 2 协作空间2. 3 文档编辑器 - 本地部署版 3. 技术介绍4. 安装5. 优势与挑战6. 个人体验7. 强大但不止于…

C++ -- 模板进阶

非模板类型参数 模板参数分为类型形参与非类型形参。类型形参&#xff1a;出现在模板参数列表中&#xff0c;跟在class 或 typename之类的参数类型名称。非类型形参&#xff1a;就是用一个常量作为类(函数)模板的一个参数&#xff0c;在类(函数)模板中将该参数当成常量来使用。…

【力扣】Go语言回溯算法详细实现与方法论提炼

文章目录 一、引言二、回溯算法的核心概念三、组合问题1. LeetCode 77. 组合2. LeetCode 216. 组合总和III3. LeetCode 17. 电话号码的字母组合4. LeetCode 39. 组合总和5. LeetCode 40. 组合总和 II小结 四、分割问题6. LeetCode 131. 分割回文串7. LeetCode 93. 复原IP地址小…

HarmonyOS 私仓搭建

1. HarmonyOS 私仓搭建 私仓搭建文档&#xff1a;https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/ide-ohpm-repo-quickstart-V5   发布共享包[https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/ide-har-publish-0000001597973129-V5]…

LabVIEW 离心泵机组故障诊断系统

开发了一套基于LabVIEW图形化编程语言设计的离心泵机组故障诊断系统。系统利用先进的数据采集技术和故障诊断方法&#xff0c;通过远程在线监测与分析&#xff0c;有效提升了离心泵的预测性维护能力&#xff0c;保证了石油化工生产的连续性和安全性。 项目背景及意义 离心泵作…

小林渗透入门:burpsuite+proxifier抓取小程序流量

目录 前提&#xff1a; 代理&#xff1a; proxifier&#xff1a; 步骤&#xff1a; bp证书安装 bp设置代理端口&#xff1a; proxifier设置规则&#xff1a; proxifier应用规则&#xff1a; 结果&#xff1a; 前提&#xff1a; 在介绍这两个工具具体实现方法之前&#xff0…

C++_STL_xx_番外01_关于STL的总结(常见容器的总结;关联式容器分类及特点;二叉树、二叉搜索树、AVL树(平衡二叉搜索树)、B树、红黑树)

文章目录 1. 常用容器总结2. 关联式容器分类3. 二叉树、二叉搜索树、AVL树、B树、红黑树 1. 常用容器总结 针对常用容器的一些总结&#xff1a; 2. 关联式容器分类 关联式容器分为两大类&#xff1a; 基于红黑树的set和map&#xff1b;基于hash表的unorder_set和unorder_ma…