当前位置: 首页 > article >正文

c++的函数对象和适配器

函数对象

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<functional>
#include<vector>
#include<algorithm>
using namespace std;
bool func(int val1,int val2)
{
	return val1 > val2;
}
void test()
{
	vector<int>v;
	v.push_back(2);
	v.push_back(7);
	v.push_back(4);
	//sort(v.begin(), v.end(),func);//降序
	sort(v.begin(), v.end(), greater<int>());
	for_each(v.begin(), v.end(), [](int val) {cout << val << " "; });
	//[](int val) {cout << val << " "; }[]是匿名函数
}
//函数对象与普通函数的区别
//1:函数对象能有自己的状态
//2:普通函数没有类型,但函数对象有
//3:函数对象比普通函数更有效率,(成员函数自动申请为内联函数)
void test01()
{
	plus<int>myplus;
	cout << myplus(3, 5) << endl;
}
int main()
{
	test01();
	system("pause");
	return 0;
}

适配器

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<functional>
#include<vector>
#include<algorithm>
using namespace std;
void print(int val)
{
	cout << val << " ";
}
struct myfunc
{
	bool operator()(int val)
	{
		cout << val << " "<<endl;
		return true;
	}
};
//struct myfunc2
//{
//	bool operator()(int val)
//	{
//		cout << val + 10 << " ";
//		return true;
//	}
//};
//第一步:继承binary_function<参数一,参数二,返回类型>
struct myfunc2 :public binary_function<int, int, void>
{
	void operator()(int val1, int val2)const
	{
		cout << val1 + val2 << " ";//第三步实现函数体
	}
};
void test()
{
	vector<int>v;
	v.push_back(2);
	v.push_back(34);
	v.push_back(122);
	//for_each(v.begin(), v.end(), print);
	for_each(v.begin(), v.end(), myfunc());
	//返回时每个都加十
	for_each(v.begin(), v.end(), bind2nd(myfunc2(),10));//第四步:用bind2nd绑定函数对象
}
//bind1st把10绑定给第一个参数,bind2nd把10绑定给第二个参数
//函数对象适配器not1 not2取反
//1:not1和not2区别:not1针对一元函数对象,not2针对二元函数对象
//第一步:继承
struct mynotfunc:public unary_function<int,bool>
{
	bool operator()(int val)const//第二步:变常函数
	{
		return val >= 20;
	}
};
int myfind(int val)
{
	return val > 20;
}
void test02()
{
	vector<int>v;
	v.push_back(2);
	v.push_back(34);
	v.push_back(122);
	vector<int>::iterator it=find_if(v.begin(), v.end(),not1( mynotfunc()));//第三步:适配
	//vector<int>::iterator it = find_if(v.begin(), v.end(), myfind);
	
	if (it == v.end())
	{
		cout << " 查找失败" << endl;
	}
	else
	{
		cout << " 查找成功" << *it << endl;//结果:打印出2
	}
}
//not2的使用
struct myprint
{
	bool operator()(int val1)
	{
		cout << val1 << " ";
		return true;
	}
 };
struct mysort
{
	bool operator()(int val1, int val2)
	{
		return val1 > val2;
	}
};
void test03()
{
	vector<int>v;
	v.push_back(2);
	v.push_back(34);
	v.push_back(122);
	//sort(v.begin(), v.end(),mysort());
	//debug下会报错
	sort(v.begin(), v.end(), not2(less<int>()));
	//for_each(v.begin(), v.end(), myprint());
	for_each(v.begin(), v.end(), [](int val) {cout << val << " "; });
}
//普通函数进行适配
//第一步:把一个参数变两个参数
void myprint1(int val,int val2)
{
	cout << val+val2 << " ";
}
void test04()
{
	vector<int>v;
	v.push_back(2);
	v.push_back(34);
	v.push_back(122);
	//第二步:把普通函数变函数对象ptr_fun
	for_each(v.begin(), v.end(), bind2nd(ptr_fun(myprint1),100));
}
//成员函数适配
class maker
{
public:
	maker(string name, int age)
	{
		this->name = name;
		this->age = age;
	}
	void myprint2()
	{
		cout << "name:" << name << " " << "age:" <<age << endl;
	}
public:
	string name;
	int age;
};
//void myprint2(maker& m)
//{
//	cout << "name:" << m.name << " " << "age:" << m.age << endl;
//}

void test05()
{
	vector<maker>v;
	v.push_back(maker("aaa", 10));
	v.push_back((maker("huihui", 18)));
	v.push_back(maker("hhh", 20));
	//for_each(v.begin(), v.end(), myprint2);
	//当容器存储的是对象,用mem_fun_ref来适配它的成员函数
	for_each(v.begin(), v.end(),mem_fun_ref( & maker::myprint2));
	vector<maker*>v2;
	v2.push_back(new maker("aaa", 10));
	v2.push_back((new maker("huihui", 18)));
	v2.push_back(new maker("hhh", 20));
	//当容器存储的是对象指针,用mem_fun来适配它的成员函数
	for_each(v2.begin(), v2.end(), mem_fun(&maker::myprint2));
	
}
int main()
{
	test05();
	system("pause");
	return 0;
}


http://www.kler.cn/a/154906.html

相关文章:

  • 学习rust语言宏之macro_rules!
  • SpringCloud-使用FFmpeg对视频压缩处理
  • 机器学习-35-提取时间序列信号的特征
  • 虎扑APP数据采集:JavaScript与AJAX的结合使用
  • python os.path.basename(获取路径中的文件名部分) 详解
  • mysql每日一题(上升的温度,date数据的计算)
  • 目标检测YOLO系列从入门到精通技术详解100篇-【目标检测】单目视觉估计
  • 富文本编辑器(wangEditor 5)
  • Chat-GPT原理
  • 93基于matlab的萤火虫算法优化支持向量机(GSA-SVM)分类模型
  • Python中的split()、rsplit()、splitlines()的区别
  • opencv学习三:保存图片
  • 一起学docker系列之十四Dockerfile微服务实践
  • 《opencv实用探索·八》图像模糊之均值滤波简单理解
  • 【性能测试】稳定性/并发压力测试的TPS计算+5W并发场景设计...
  • FL Studio水果软件2024简体中文语言版本下载
  • elment Loading 加载组件动态变更 text 值bug记录
  • 【海思SS528 | VO】MPP媒体处理软件V5.0 | VO模块编程总结
  • DS二分查找_搜索二维矩阵
  • C++包装类
  • 山西电力市场日前价格预测【2023-12-04】
  • Mysql安全之基础合规配置
  • C#网络编程(System.Net命名空间和System.Net.Sockets命名空间)
  • json标签
  • PG时间计算
  • 使用FFmpeg开发2-比特流过滤器