注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

gmd20的个人空间

// 编程和生活

 
 
 

日志

 
 

类成员函数做为STL中排序函数sort的比较函数的特殊情况,一个类似mem_fun的function object  

2009-11-26 14:36:25|  分类: 程序设计 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

       因为需要调用sort函数来做一点事情,但sort是不支持使用类的成员函数来做比较函数的。
如果要使用类成员函数作为比较函数到话,是需要使用stl中的mem_fun这个function object。但我的需求有点特殊,mem_fun并不能满足我的要求,因为mem_fun是要求比较的对象就是你要使用的那个类成员函数的同一个类。但我是需要在另外一个类中去比较另一种类型。还好在stl的mem_fun 源码基础上修改出一个 mem_fun2来满足我的要求也不是很复杂。C++的模板就是强大啊,我还不是经常用到。 看看下面的例子,我想在Test类中判断比较int类型。



#include <iostream>

using namespace std ;


class Test {
private:
   const static int data[11] ;

public:
   bool greater ( const int & i1 ,const  int & i2){
       return data[i1] > data[i2];
   }

};
const int  Test::data[11]= {10,9,8,7,6,50,40,3,2,1,0};

#include <algorithm>
#include <functional>


 template<typename _Ret, typename _Tp, typename _Arg>
    class mem_fun2_t : public binary_function<_Arg , _Arg , _Ret>
    {
    public:
      explicit
      mem_fun2_t(_Ret (_Tp::*__pf)(const _Arg &, const _Arg & ), _Tp *__ptr)
      : _M_f(__pf), __p(__ptr){ }

      _Ret
      operator()(const _Arg & __x, const _Arg & __y) const
      { return (__p->*_M_f)(__x,__y); }

    private:
      _Ret (_Tp::*_M_f)(_Arg & ,_Arg & );
      _Tp * __p;
    };

    template<typename _Ret, typename _Tp, typename _Arg>
      inline mem_fun2_t<_Ret, _Tp, _Arg>
      mem_fun2(_Ret (_Tp::*__f)(_Arg &,_Arg &), _Tp *__p)
      { return mem_fun2_t<_Ret, _Tp, _Arg>(__f, __p); }

 

int main()
{
static int list[10] ={2,3,4,5,6,7,8,9,1,4};

Test   t1;

for (int i =0 ; i < 10 ; i++)
{
      cout <<     list[i] << " ";
}
      cout << endl;


sort (&list[0],&list[10], mem_fun2(&Test::greater,&t1) );

for (int i =0 ; i < 10 ; i++)
{
  cout <<     list[i] << " ";
}
cout << endl;

return 0;

}

执行程序,很好到满足了我的要求
~/桌面$ ./a.out
2 3 4 5 6 7 8 9 1 4   排序前
5 6 1 2 3 4 4 7 8 9   排序后


  评论这张
 
阅读(910)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017