【C++函数对象】STL基础语法学习 | 仿函数谓词内建仿函数

news2024/11/16 7:29:04


目录

●仿函数

1.概念

2.使用

●谓词

1.一元谓词

2.二元谓词

 ●内建仿函数

1.算数仿函数

2.关系仿函数

3.逻辑仿函数


●仿函数

1.概念

        重载函数调用操作符的类,其对象常称为函数对象。函数对象使用重载的()时,行为类似函数的调用,所以也叫仿函数。它的本质为一个类,而不是一个函数。

2.使用

        功能特点:

                1.仿函数在使用时可以像普通函数那样调用,可以有参数和返回值

#include<iostream>
using namespace std;
//仿函数在使用时可以像普通函数那样调用,可以有参数和返回值
class add {
public:
	int operator()(const int value1, const int value2)
	{
		return value1 + value2;
	}
};
class sub {
public:
	int operator()(const int value1, const int value2)
	{
		return value1 - value2;
	}
};
class mul {
public:
	double operator()(const double value1,const double value2)
	{
		return value1 * value2;
	}
};
void text()
{
	add ad;
	cout << "相加:" << ad(10, 20) << endl;
	sub sb;
	cout << "相减:" << sb(10, 20) << endl;
	mul ml;
	cout << "相乘:" << ml(5.5,7) << endl;
}
int main()
{
	text();
}

                2.仿函数不同于普通函数的概念,它可以有自己的状态

#include<iostream>
using namespace std;
class print {
public:
	void operator()(const int value1,const int value2)//仿函数不同于普通函数的概念,它可以有自己的状态
	{
		cout << "相加:" << value1 + value2 << endl;
		cout << "相减:" << value1 - value2 << endl;
		cout << "相乘:" << value1 * value2 << endl;
	}
};
void text()
{
	print pt;
	pt(10,20);
}
int main()
{
	text();
}

                3.仿函数可以作为参数传递

#include<iostream>
using namespace std;
class print {
public:
	void operator()(const int value1, const int value2)
	{
		cout << "相加:" << value1 + value2 << endl;
		cout << "相减:" << value1 - value2 << endl;
		cout << "相乘:" << value1 * value2 << endl;
	}
};
void scanf(print &pt)//仿函数可以作为参数传递
{
	pt(10,20);
}
void text()
{
	print pt;
	scanf(pt);
}
int main()
{
	text();
}


●谓词

1.一元谓词

                如果仿函数的返回值为bool类型并且operator()接受一个参数,则称它为一元谓词

#include<iostream>
#include<algorithm>  //STL算法头文件定义
#include<vector>
using namespace std;
class unitary {
public:
	bool operator()(const int value)  //一元仿函数
	{
		return value == 20;
	}
};
void text()
{
	vector<int>v;
	for (int i = 1, j = 10; i <= 10; i++, j += 10)
	{
		v.push_back(j);
	}
	//10 20 30 40 50 60 70 80 90 100
	vector<int>::iterator p = find_if(v.begin(), v.end(), unitary());  
	//利用find_if这个算法,在一元仿函数中去判断vector容器中是否有元素20
	if (p == v.end())
		cout << "未找到" << endl;
	else
		cout << "从vector容器中找到了值为20的元素" << endl;
}
int main()
{
	text();
}

2.二元谓词

                如果仿函数的返回值为bool类型并且operator()接受两个参数,则称它为二元谓词

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
void printvector(vector<int>&v)
{
	for (vector<int>::iterator i = v.begin(); i != v.end(); i++)
	{
		cout << *i<<" ";
	}
	cout << endl;
}
class compare {
public:
	bool operator()(const int value1,const int value2)  //二元仿函数
	{
		return value1 > value2;
	}
};
void text()
{
	vector<int>v;
	v.push_back(45);
	v.push_back(10);
	v.push_back(9);
	v.push_back(67);
	v.push_back(35);
	//45 10 9 67 35
	cout << "从小到大排序:";
	sort(v.begin(), v.end());
	//9 10 35 45 67
	printvector(v);
	cout << "从大到小排序:";
	sort(v.begin(), v.end(), compare());
	//67 45 35 10 9
	printvector(v);
}
int main()
{
	text();
}


 ●内建仿函数

1.算数仿函数

函数原型:

       ■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> //取反仿函数

#include<iostream>
#include<functional>  //内建仿函数头文件定义
using namespace std;
void text()
{
	//相加仿函数
	plus<int>p;
	cout << "相加:" << p(10, 20) << endl;
	//相减仿函数
	minus<float>mi;
	cout << "相减:" << mi(3.18,2.90) << endl;
	//乘法仿函数
	multiplies<double>mu;
	cout << "相乘:" << mu(9.19, 3.14) << endl;
	//除法仿函数
	divides<double>di;
	cout << "相除:" << di(25.75, 3.15) << endl;
	//取模仿函数
	modulus<int>mo;
	cout << "取模:" << mo(9,4) << endl;
	//取反仿函数
	negate<int>n;
	cout << "取反:" << n(1) << endl;
}
int main()
{
	text();
}

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>
#include<algorithm>
#include<functional>
#include<vector>
using namespace std;
void printvector(vector<int>&v)
{
	for (vector<int>::iterator i = v.begin(); i != v.end(); i++)
	{
		cout << *i<<" ";
	}
	cout << endl;
}
void text()
{
	vector<int>v;
	cout << "请向vector容器中输入元素:" << endl;;
	for (int i = 1; i <= 10; i++)
	{
		int elem; cin>>elem;
		v.push_back(elem);
	}
	//常用关系仿函数
	//大于=降序
	sort(v.begin(),v.end(),greater<int>());
	printvector(v);
	//小于=升序
	sort(v.begin(), v.end(), less<int>());
	printvector(v);
}
int main()
{
	text();
}

3.逻辑仿函数

函数原型:(该仿函数基本不用,所以下面代码中只做简单了解)

        ■template<class T> bool logical and<T>         //逻辑与 

        ■template<class T> bool logical or<T>         //逻辑或

        ■template<class T> bool logical not<T>         //逻辑非

#include<iostream>
#include<vector>
#include<functional>
#include<algorithm>
using namespace std;
void printvector(vector<bool>&v)
{
	for (vector<bool>::iterator i = v.begin(); i != v.end(); i++)
	{
		cout << *i<<" ";
	}
	cout << endl;
}
void text()
{
	vector<bool>v;
	v.push_back(true);
	v.push_back(false);
	cout << "初始状态:" << endl;
	printvector(v);
	
	vector<bool>v1;
	v1.resize(v.size());
	transform(v.begin(), v.end(), v1.begin(), logical_not<bool>());
	cout << "逻辑非后的状态:" << endl;
	printvector(v1);
}
int main()
{
	text();
}


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

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

相关文章

技术更高,设计更远:华为全屋智能设计大赛的审美之跃

“人生到处知何以&#xff1f;应似飞鸿踏雪泥。泥上偶然留指爪&#xff0c;鸿飞那复计东西。”很多设计师朋友跟我说&#xff0c;苏轼这首《和子由渑池怀旧》是对设计与审美的最高理解。好的设计&#xff0c;应该仅仅留下一点点痕迹&#xff0c;同时在简约的表象下隐含大量的审…

高通平台开发系列讲解(USB篇)USB调试手段汇总说明 - 视频课

文章目录 一、USB AT数据流说明二、BUS Hound 工具说明三、sysfs相关USB调试节点四、USB usbmon工具使用五、USB usbmon日志解析六、UsbTreeView软件的使用七、视频讲解分享沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 碰见USB AT不通怎么办?所以本篇章汇总了高通…

Vue与React中父子组件生命周期的执行顺序?【生命周期详细知识讲解!!!】

文章目录一、 Vue中父子组件生命周期1-1 加载渲染过程1-2 销毁过程1-3 展示案例二、 React中父子组件生命周期2-1 关于React新旧版生命周期介绍2-2 父子组件生命周期2-2-1 父子组件初始化2-2-2 子组件修改自身state2-2-3 父组件修改props2-2-4 卸载子组件一、 Vue中父子组件生命…

卷绕剩余长度计算FC(收放卷应用)

卷径实时计算方法详细内容请参看下面的文章链接: 卷径计算详解(通过卷绕的膜长和膜厚进行计算)_RXXW_Dor的博客-CSDN博客有关卷绕+张力控制可以参看专栏的系列文章,文章链接如下:变频器简单张力控制(线缆收放卷应用)_RXXW_Dor的博客-CSDN博客_收放卷应用张力控制的开闭环…

【EHub_tx1_tx2_E100】Ubuntu18.04 + ROS_ Melodic + LingAo IMU 测试及RVIZ展示

简介&#xff1a;介绍LingAo 的6自由度IMU模块 在EHub_tx1_tx2_E100载板&#xff0c;TX1核心模块环境&#xff08;Ubuntu18.04&#xff09;下测试ROS驱动&#xff0c;打开使用RVIZ 查看IMU数据&#xff0c;本文的前提条件是你的TX1里已经安装了ROS版本&#xff1a;Melodic。 关…

Spring Boot+Mybatis+layui框架实现的前后端分离的医院药品管理系统源码+数据库

springboot layui药品管理系统 介绍 前后端分离的药品管理系统。 完整代码下载地址&#xff1a;Spring BootMybatislayui框架实现的前后端分离的医院药品管理系统源码数据库 软件架构 前端&#xff1a;layui框架 后端&#xff1a;Spring BootMybatis 数据库&#xff1a;…

静态库和动态库

&#xff08;1&#xff09;什么是库 &#xff08;2&#xff09;静态库的制作 汇编 生成对应的.o文件&#xff08;命令&#xff1a;gcc -c add.c div.c mult.c sub.c&#xff09;创建静态库&#xff08;命令&#xff1a;ar rcs libcalc.a add.o div.o mult.o sub.o&#xff09;…

数据结构-栈和队列

目录&#x1f921;前言&#x1f44d;栈&#x1f620;栈的概念及结构&#x1f620;栈的实现&#x1f44d;队列&#x1f620;队列的概念及结构&#x1f620;队列的实现&#x1f4a1;总结&#x1f921;前言 本篇博客主要记录的是栈和队列的学习和总结。 &#x1f44d;栈 &#…

虹科分享 | 如何解决CAN与以太网之间的信息有效传递与智能变送难题?

背景 在工业中&#xff0c;一般把现场总线应用于车间、生产现场等生产第一线&#xff0c;作为控制网络&#xff0c;而以太网主要应用于企业管理层和生产监控层。由于不同现场总线之间没有统一标准、难以接入因特网等缺点&#xff0c;使得目前大部分企业控制网络与信息网络相互…

猎聘和BOSS直聘谁会成为在线招聘的最后赢家?

文|螳螂观察 作者|易不二 在线招聘行业正在焕发新的巨大活力。 12月22日&#xff0c;BOSS直聘正式在港交所主板完成双重主要上市。BOSS直聘创始人赵鹏扬言&#xff0c;公司未来三年内有一个获取一亿用户的“小目标”&#xff0c;纯蓝领市场是公司完成这一目标的重要增长动力…

移位操作符和位操作符(从概念到相关算法题详解)

目录 概念 基础知识 左移操作符(<<) 右移操作符(>>) 按位与(&) 按位或(|) 异或(^) 相关算法题 1.不能创建临时变量(第三个变量),实现俩个数的交换 方法1: 方法2: 写一个方法,返回参数中二进制中1的个数 方法1: 方法2: 方法3: 俩个int(32位)整…

2019年数维杯国际大学生数学建模C题猪肉价格波动分析求解全过程文档及程序

2019年数维杯国际大学生数学建模 C题 猪肉价格波动分析 问题重述&#xff1a; 中国是一个育种大国。猪肉产业在畜牧业中起着主导作用。同时&#xff0c;猪肉已成为人们餐桌上的主要肉类来源之一。随着人口的增加&#xff0c;消费和生活也得到了改善。 2018年8月3日&#xff0…

Android Studio中设置Compose 代码模版

File Templates 有两种方式能找到编辑File Templates的入口 在 File -> New -> Edit File Templates 或者 在项目结构目录中点击右键菜单 New -> Edit File Templates 在设置界面中的 Editor -> File and Code Templates #if (${PACKAGE_NAME} && ${…

dwg怎么转成dxf格式?手机也能轻松操作

dwg怎么转成dxf格式呢&#xff1f;相信很多小伙伴应该知道这两种格式都是CAD图纸中的一种&#xff0c;那么它们有什么区别呢&#xff1f;第一&#xff0c;性质不同dwg图形文件是计算机辅助设计软件AutoCAD用来保存设计数据的专有文件格式。dxf图形文件是DWG格式的ASCII格式变体…

Codeforces Global Round 14 E Phoenix and Computers

大意&#xff1a; 一排电脑&#xff0c;每次可以选择打开一台电脑&#xff0c;如果某一台电脑相邻的左边和右边都被打开了&#xff0c;它会自动打开。问打开n台电脑的方案数 思路&#xff1a; O(n^3)做法 不难发现&#xff0c;在操作过程中&#xff0c;一台台电脑其实就是被…

电磁明渠流量计怎么安装?

1、设备介绍 电磁明渠流量计是由流量显示仪、流速计、液位计组成的流速面积法测流量的明渠测量流量系统。 工作原理&#xff1a;基于法拉第电磁感应定律&#xff0c;当导电流体流过电磁式流速仪的磁场时&#xff0c;在与流速和磁场两者相垂直的方向就会产生与平均流速成正比的…

C++ 数学与算法系列之牛顿、二分迭代法求解非线性方程

1. 前言 前文介绍了如何使用“高斯消元法”求解线性方程组。 本文秉承有始有终的态度&#xff0c;继续介绍“非线性方程”的求解算法。 本文将介绍 2 个非线性方程算法&#xff1a; 牛顿迭代法。二分迭代法。 牛顿迭代法&#xff08;Newtons method&#xff09;又称为牛顿…

千万别熬夜:只有睡觉,才能修复DNA损伤

睡眠是人体的一种修复过程&#xff0c;可以恢复精神和解除疲劳。人的一生中&#xff0c;大约三分之一的时间是在睡眠中度过&#xff0c;良好的睡眠是国际社会公认的三项健康标准之一&#xff0c;而睡眠时间过短或睡眠不佳均会影响健康。在中国&#xff0c;超3亿人存在睡眠障碍、…

基于智能电控柜原理的物联网云平台方案

本方案基于智能电控柜的原理&#xff0c;通过无线传输模块将现场采集到的数据经过无线网络发送到物联网云平台&#xff0c;同时可通过云组态和数据中心将现场画面所见即所得的同步到互联网终端。 用户在安装有监控软件后&#xff0c;可以用手机 APP或者在云平台上直接控制电控柜…

Ubuntu自动登录脚本,expect自动切换用户,xshell自动登录脚本

Ubuntu自动登录脚本&#xff0c;expect自动切换用户&#xff0c;xshell自动登录脚本一、!/usr/bin/expect -f的意义二、spawn命令行&#xff1a;三、send命令&#xff1a;四、expect五、interact命令&#xff1a;六、xshell自动化脚本1、怎么使用脚本2、编写脚本3、vbs的不足本…