函数对象-C++

1.定义

2.特点

1.解释第一句

cpp 复制代码
#include<stdio.h>
using namespace std;
#include<string>
#include<map>
#include <iostream>
class print
{
public:
	void operator()(string s)
	{
		cout << s << endl;
	}
};
int main()
{
	print print;
	print("hello world");
	return 0;
}

2.解释第二句

可以有自己的状态:指的是他和普通的函数不同,例如他可以统计自己调用了几次。

也就是说,它可以向函数一样被调用,但是却拥有类的功能,他是类和函数的结合。

cpp 复制代码
#include<stdio.h>
using namespace std;
#include<string>
#include<map>
#include <iostream>
class print
{
public:
	print()
	{
		this->count = 0;
	}
	void operator()(string s)
	{
		cout << s << endl;
		this->count++;
	}
	int count;
};
int main()
{
	print print;
	print("hello world");
	print("hello world");
	print("hello world");
	print("hello world");
	print("hello world");
	cout << print.count << endl;
	return 0;
}

3.解释第三句

cpp 复制代码
#include<stdio.h>
using namespace std;
#include<string>
#include<map>
#include <iostream>
class print
{
public:
	print()
	{
		this->count = 0;
	}
	void operator()(string s)
	{
		cout << s << endl;
		this->count++;
	}
	int count;
};
void test(print p, string s)
{
	p(s);
}
void test01()
{
	print print;
	test(print, "C++");
}
int main()
{
	test01();
	return 0;
}

函数对象不仅可以作为函数参数,还可以再调用的函数中去使用自己重载过的小括号

具体见

void test(print p, string s)
{
p(s);
}

3.内建函数对象

1.定义

2.内建函数对象-算数仿函数

1.函数原型
2.取反仿函数(一元仿函数)
cpp 复制代码
#include<stdio.h>
using namespace std;
#include<string>
#include<vector>
#include<functional>
#include <iostream>
int main()
{
	negate<int>n;
	cout << n(10) << endl;
	return 0;
}
3.加法仿函数(二元仿函数)
cpp 复制代码
#include<stdio.h>
using namespace std;
#include<string>
#include<vector>
#include<functional>
#include <iostream>
int main()
{
	plus<int>n;
	cout << n(10,20) << endl;
	return 0;
}

注意:plus模板参数列表中只需要有一个int就行,是为了防止出现两个不同类型的数据相加

4.内建函数对象-关系仿函数

1.函数原型
2.代码
cpp 复制代码
#include<stdio.h>
using namespace std;
#include<string>
#include<vector>
#include<functional>
#include<algorithm>
#include <iostream>
int main()
{
	vector<int> v;
	v.push_back(1);
	v.push_back(5);
	v.push_back(3);
	v.push_back(2);
	sort(v.begin(), v.end(), greater<int>());
	for (int i = 0; i < v.size(); i++)
	{
		cout << v[i] << endl;
	}
	return 0;
}

5.内建函数对象-逻辑仿函数

1.函数原型
2.代码
cpp 复制代码
#include<stdio.h>
using namespace std;
#include<string>
#include<vector>
#include<functional>
#include<algorithm>
#include <iostream>
int main()
{
	vector<int> v;
	v.push_back(1);
	v.push_back(5);
	v.push_back(3);
	v.push_back(2);
	vector<int> v1;
	v1.resize(v.size());
	transform(v.begin(), v.end(),v1.begin(), logical_not<bool>());
	for (int i = 0; i < v.size(); i++)
	{
		cout << v[i] << " ";
	}
	cout << endl;
	for (int i = 0; i < v1.size(); i++)
	{
		cout << v1[i] << " ";
	}
	cout << endl;
	return 0;
}

其中用到了搬运函数transform,需要提前给他开辟相应的空间

v1.resize(v.size());
transform(v.begin(), v.end(),v1.begin(), logical_not<bool>());

4.注意

逻辑仿函数实际应用较少,了解即可

相关推荐
2601_962071574 小时前
【Java报错已解决】org.springframework.beans.factory.BeanCreationException
java·开发语言
淡海水5 小时前
07-04-并发-ConcurrentBag-T-工作窃取WorkStealing算法
开发语言·算法·c#·bag·concurrent·workstealing
leobertlan5 小时前
好玩系列:训练一个神经网络模型指导小孩玩游戏2-大局观教练
算法
CS_Zero6 小时前
C语言sizeof是函数吗?
c语言·开发语言
Tisfy6 小时前
LeetCode 3876.构造奇偶一致的数组 II:三种情况分类讨论(其实还是脑筋急转弯)
算法·leetcode·题解·脑筋急转弯
-今昭-7 小时前
《V2V 迁移实战:将 VMware 虚拟机转为 OpenStack 可用 Glance qcow2 镜像》
开发语言·python
乐迪信息7 小时前
智慧港口船舶AI算法实现在线状态监测
大数据·人工智能·深度学习·算法·计算机视觉
黑马程序员毕设8 小时前
基于Java的医院药品管理系统的优化设计与实现
java·开发语言·spring boot·小程序·架构·课程设计·毕设
木井巳8 小时前
【BFS/DFS 解决 FloodFill 算法】太平洋大西洋水流问题
java·算法·leetcode·深度优先·广度优先·宽度优先·推荐算法
心抵鹊9 小时前
归并排序之翻转对(hard)
数据结构·算法