如何使用Function Object

 我来答
huanglenzhi
推荐于2016-11-22 · 知道合伙人数码行家
huanglenzhi
知道合伙人数码行家
采纳数:117538 获赞数:517198
长期从事计算机组装,维护,网络组建及管理。对计算机硬件、操作系统安装、典型网络设备具有详细认知。

向TA提问 私信TA
展开全部
*****函数对象,形式上是经一个类实例化的对象,本质上是为了实现某种与函数等价的功能。函数对象的思想是:用类来封装一个函数功能,然后用这个类实例化不同的函数对象。
*****
*****函数对象的使用场合在STL中比较常见。不知你用STL用得多不多,STL里面用到非常多的函数对象。比如:std::map,它是一个模板类,实际使用时需要三个数据类型去替代其中的三个模板,从而使std::map<arg0,arg1,arg2>成为一个真正的类。其中第三个参数arg2就是一个函数对象,STL默认的是std::less(一个STL已经定义好的能够实现比较功能的函数对象)。std::less本身也是一个模板形式的函数对象,它能对全部基本数据类型以及STL中定义的类型的值进行比较,从而通过arg0(关键字)决定std::map中元素的排序。
*****
*****实际使用时,多数人为图方便,一般这样用std::map,即:
class AnyClass;
std::map <int,AnyClass> mapOfAnyClass;
这个mapOfA能实现动态数组功能,不过这个数组存储的元素是:始终按mapOfA.first(int类型)排好序的mapOfA.second(AnyClass的对象)集合。
*****
*****其实arg0(排序关键字)不一定非得是一般类型(int之类的),也可以是自己定义的struct MyStruct;或者class MyClass
{public:
int key1;
float key2;
};
因为std::map需要对关键字排序,而它默认用函数对象std::less去实现,假如用新的类型myClass做关键字,std::map无法对其中的元素进行排序。怎么办?
*****
*****另外自定义一个函数对象,替代std::less,定义如下:
class CompairMyClass
{
public:
bool operator()(MyClass par1, MyClass par2)
{
if(par1.key1 < par2.key1 && par1.key2 < par2.key2 )
{
return true;
}
else
{
return false;
}
};//class CompairMyClass
接着就可以用这么一种新map了: std::map <MyClass,AnyClass,CompairMyClass> mapOfMyOwn;
这种map有什么神奇之处呢?它能实现对双关键字(一个整数关键字,一个小数关键字)的排序数组,而原先的std::map是无法实现该功能的,这就相当于升级了STL。而其中的大功臣就是函数对象CompairMyClass。】
*****
*****函数对象主要是为了使STL支持一些自定义的类,其它场合很少用到函数对象,据我所知。这对热衷STL的编程人员来说,已经算是一件盛事!
微测检测5.10
2023-05-10 广告
您好!建议咨 深圳市微测检测有限公司,已建立起十余个专业实验室,企业通过微测检测就可以获得一站式的测试与认 证解决方案;(EMC、RF、MFi、BQB、QI、USB、安全、锂电池、快充、汽车电子EMC、汽车手机互 联、语音通话质量),认证遇... 点击进入详情页
本回答由微测检测5.10提供
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式