依据类的成员来对类进行排序的泛型方法

原创 2003年08月15日 18:20:00

//最近在工作中,遇到这样一个问题:
//一个类中有十几个成员数据,我需要根据不同的成员提供不同的排序方法. 如下:

class Cell
{
public:
    string name;
    string time;
    int   tchDrop;
    double traffic;
    // more …
};

//最近正在学习STL,所以我想结合所学的知识,设计出一种通用的方法,只要提
//供类的成员指针和排序准则(即函数对象),就可
//以同STL算法搭配,对类成员进行比较排序,比较等.

template<typename T,typename C,typename Pred=less<T> >
class Comp_Mem_Data
              :public binary_function<C,C,bool>
{
public:
 Comp_Mem_Data( T (C::*pmd) , Pred pred=Pred() )
        //Pred类采用默认构造函数,并不一定都适用。要注意。 
  :m_pmd(pmd),m_pred(pred)
 {};

 //比较 两个类对象 的成员
 bool operator() (const C& a , const C& b) const
 {
  return m_pred( a.*m_pmd , b.*m_pmd );
 };

private:
 T  (C::*m_pmd); //类成员指针
 Pred m_pred;   //比较函数
};

//仿照标准库中的 bind1st,bind2nd 的做法,提供一个方便的调用形式
template<typename T,typename C>
Comp_Mem_Data<T,C,less<T> >  comper_mem_data( T (C::*pmd) )
{
 return Comp_Mem_Data<T,C,less<T> >(pmd,less<T>() );
}
template<typename T,typename C,typename Pred>
Comp_Mem_Data<T,C,Pred>  comper_mem_data( T (C::*pmd) ,Pred pred )
{
 return Comp_Mem_Data<T,C,Pred>(pmd,pred);
}

//以下就可以开始比较了.
// sort(vCell.begin(),vCell.end(), comper_mem_data( &Cell::name) );
//sort(vCell.begin(),vCell.end(), comper_mem_data( &Cell::traffic , greater<double>() );
//等等

//以下是测试程序 在BCB5.5 、 MSVC6.0 中测试通过

#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <functional>
using namespace std;

inline ostream& operator << (ostream& out,const Cell& cell)
{
 out<<cell.name<<" | "
  <<cell.time<<" | "
  <<cell.tchDrop<<" | "
  <<cell.traffic<<" | "
  // more …
  <<endl;
 return out;
}

template<typename Container>
void output(Container cont) 
{
 cout<<"cell name | time | tchDrop | traffic"<<endl;
 for(int j=0;j<cont.size();++j)
  cout<<cont[j];
}

int main()
{
 vector<Cell> vCell;
 Cell  cl;
 srand( (unsigned)time( NULL ) );
 for(int i=0;i<10; ++i)
 {
  cl.name=static_cast<char>(i+'A');
  cl.time=static_cast<char>(rand()%10+'1');
  cl.tchDrop=rand()%100;
  cl.traffic=rand()*100.0/RAND_MAX;
  vCell.push_back(cl);
 }

 sort(vCell.begin(),vCell.end(), comper_mem_data(&Cell::tchDrop) );
 output(vCell);
 sort(vCell.begin(),vCell.end(), comper_mem_data(&Cell::traffic, greater<double>() ) );
 output(vCell);

 vector<Cell>::const_iterator iter=find_if( vCell.begin() , vCell.end() ,
         bind2nd(comper_mem_data(&Cell::name , equal_to<string>() ),cl )
 );
 cout<<((iter!=vCell.end() ) ? ("cl is find") : ("cl isn't find") )<<endl;

 char lc;
 cin>>lc;
 return 0;
}

//程序的一个输出如下:
/*
cell name | time | tchDrop | traffic
A | 3 | 2 | 47.0168 |
C | 1 | 2 | 66.5151 |
D | 5 | 19 | 86.5017 |
F | 9 | 23 | 11.1087 |
E | 5 | 78 | 75.7897 |
G | 7 | 84 | 54.2253 |
H | 7 | 88 | 61.1774 |
I | 1 | 90 | 59.2578 |
J | 3 | 94 | 89.9625 |
B | 6 | 99 | 89.2514 |
cell name | time | tchDrop | traffic
J | 3 | 94 | 89.9625 |
B | 6 | 99 | 89.2514 |
D | 5 | 19 | 86.5017 |
E | 5 | 78 | 75.7897 |
C | 1 | 2 | 66.5151 |
H | 7 | 88 | 61.1774 |
I | 1 | 90 | 59.2578 |
G | 7 | 84 | 54.2253 |
A | 3 | 2 | 47.0168 |
F | 9 | 23 | 11.1087 |
cl is find
//*/

//用同样的方法,还可以制作出比较两个类成员函数返回值的泛型类,
// 类数据成员 与 同类型的常数参数相比较的泛型类来。
//此处不一一列出。

//以上不当之处,还请各位大虾不吝指教。

C++对类或结构体进行指定规则排序

STL中就自带了排序函数sortsort 对给定区间所有元素进行排序.使用#include sort即可使用,语法描述为:sort(begin,end,cmp),表示一个范围。其中cmp是自己指定的...
  • xyisv
  • xyisv
  • 2017年12月03日 17:51
  • 101

对类依据成员进行排序

import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.u...
  • qq_27231343
  • qq_27231343
  • 2016年03月06日 20:36
  • 111

Python3对一个class类型的list按class中某一属性排序

写作业的时候需要对一个point(x,y)类型的list按照point的x坐标从小到大排序,于是去网上找了,但是并没有找到如题的回答(其实有一个意思的回答但是我认为不是这个意思就没注意看),然后就去找...
  • Momeak_Ray
  • Momeak_Ray
  • 2017年10月24日 18:26
  • 254

对数组进行冒泡排序,使用comparable接口实现

例:写一个方法对任意引用数据类型数组进行排序。具体要求如下: 1) 方法声明为public  void sortArr(Object arr[]){  } 2) 方法中首先输出排序前数组内容,然后...
  • yuanxin0
  • yuanxin0
  • 2017年07月27日 11:18
  • 244

结构体数组中的某个成员进行排序

class Program    {        static void Main(string[] args)        {                                  ...
  • meifage2
  • meifage2
  • 2011年07月17日 21:59
  • 1896

根据类中的某个属性对类进行排序

有时候,我们会有这样的需求:通过制定的类中的元素,对多个实例对象进行排列显示。 那么,今天我为大家写了这样一个类,以便使用 话不多说,贴上源码 public class ListSortE>...
  • leiliang568
  • leiliang568
  • 2016年01月08日 12:13
  • 227

对自定义对象进行排序(C++/Java)

自定义了对象,如何按照自定对象中某一或多个元素对其进行排序呢?以下分别从C++和java对其进行实现。 一:C++ /* 实现对自定义的对象类型进行排序(按照其中的元素),首先将对象存放在ve...
  • Lu597203933
  • Lu597203933
  • 2014年12月06日 17:08
  • 2570

sort 排序类类型对象。。

sort 排序默认的是升序,且容器中的元素必须是重载了#include #include #include #include using namespace std; //for...
  • acdnjjjdjkdckjj
  • acdnjjjdjkdckjj
  • 2011年03月08日 17:55
  • 5479

C++ sort函数对class类排序

sort是stl中一个经常用到的排序函数,可以对数组或类似数组(例如vector)的结构进行排序,默认为升序排序。 例如下面的代码对vec进行升序排序: sort(vec.begin(),...
  • zsy162534
  • zsy162534
  • 2016年08月03日 10:07
  • 315

如何使用Arrays.sort()对自己定义的类进行排序

首先你要定义自己的类,该类必须继承自Comparable抽闲接口,因为调用sort排序的对象必须是可以比较的,通过重载Comparable接口的compareTo函数定义自己的比较规则,下面是我定义的...
  • WitsMakeMen
  • WitsMakeMen
  • 2013年05月06日 09:31
  • 4479
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:依据类的成员来对类进行排序的泛型方法
举报原因:
原因补充:

(最多只允许输入30个字)