看有的代码可以用函数实现,却用类来封装.具体例子是这样:比如STL的list容器,sort的函数可以自定义一般这样处理://comparison,notcasesensitive.boolcompare_nocase(stringfirst,stringsecond){unsignedinti=0;while((i
2 回答
潇湘沐
TA贡献1816条经验 获得超6个赞
上面那种是functions,下面这种叫做functors.(我姑且翻译成函子)两者最本质的区别在于,上面仅仅是一个过程;而下面,却可以包含状态。后者,可以轻松实现闭包。在C++11里面,后者直接演化为lambda了。我就用你提到的sort来举一个小例子:cppboolmyfunction(inti,intj){return(i structmyclass{booloperator()(inti,intj){return(i}myobject; std::vectormyvector{32,71,12,45,26,80,53,33}; std::sort(myvector.begin(),myvector.end(),myfunction);std::sort(myvector.begin(),myvector.end(),myobject);简化了你的例子,我们来关注本质区别。看起来,好像等效对不?那么现在需求变了,排序的时候,我只希望排值大于40的元素,请问咋整,你说,只好把这个40写到函数里了。那如果我说这个40是来自用户输入呢?也可能是50或是60,请问怎么办?此时,function好像有点没有用武之地了。但我们的functor却依然可以大显身手。cppstructmyclass{intflag;myclass(inti):flag(i){}booloperator()(inti,intj){return((flag};std::vectormyvector{32,71,12,45,26,80,53,33}; myclassmyobject(40);std::sort(myvector.begin(),myvector.end(),myobject);//output:3212263345537180例子可能有点怪。。但你明白这意思了么?
慕斯709654
TA贡献1840条经验 获得超5个赞
这个struct其实是functor,国内译成仿函数,它的好处是可以保存状态。我举个例子,你现在用compare_nocase的函数指针作为参数,假如突然又有一个地方要求你比较字符串,但此时要求你忽略首字母,从第二个字符串开始比较,那么你应该怎么做?1.要么你重新写一个compare_nocase2函数,但会造成大量重复代码。2.要么你弄个intstart变量,然后放在compare_nocase的外面,在执行我刚才说的这个需求时候,先改变start=2,执行完以后再把全局变量改回去。可以看到,都不优雅。或许你想到了把compare_nocase写到一个类里,但这必须要是staticmethod。而functor的解决很简单。cppstructmylistSort{intstart;mylistSort(intp){start=p;}booloperator()(stringfirst,stringsecond)const{inti=start-1;while((iif(tolower(first[i]) ++i; }if(first.length()elsereturnfalse; }};这样你从首字符开始比较就可以mylist.sort(mylistSort(1));而当你需要忽略首字符,从第二个字母开始比较的时候就可以mylist.sort(mylistSort(2));这样就轻松避免了全局变量的状态管理。事实上functor还有很多其他好处,特别是配合template来写,会发挥很大作用!对了,C++11的话,可以这样写cppmylist.sort([](stringfirst,stringsecond){//比较逻辑});C++14的话还能把它改成auto~~
添加回答
举报
0/150
提交
取消