依據類的成員來對類進行排序的泛型方法 (轉)

amyz發表於2007-11-13
依據類的成員來對類進行排序的泛型方法 (轉)[@more@]

//最近在工作中,遇到這樣一個問題:
//一個類中有十幾個成員資料,我需要根據不同的成員提供不同的排序方法. 如下:

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

//最近正在學習STL,所以我想結合所學的知識,設計出一種通用的方法,只要提
//供類的成員指標和排序準則(即),就可
//以同STL演算法搭配,對類成員進行比較排序,比較等.

template >
class Comp_Mem_Data
  :public binary_function
{
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
Comp_Mem_Data >  comper_mem_data( T (C::*pmd) )
{
 return Comp_Mem_Data >(pmd,less() );
}
template
Comp_Mem_Data  comper_mem_data( T (C::*pmd) ,Pred pred )
{
 return Comp_Mem_Data(pmd,pred);
}

//以下就可以開始比較了.
// sort(vCell.begin(),vCell.end(), comper_mem_data( &Cell::name) );
//sort(vCell.begin(),vCell.end(), comper_mem_data( &Cell::traffic , greater() );
//等等

//以下是測試 在BCB5.5 、 MSVC6.0 中測試透過

#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;

inline ostream& operator << (ostream& out,const Cell& cell)
{
 out< < < < // more …
 < return out;
}

template
void output(Container cont) 
{
 cout< for(int j=0;j cout<}

int main()
{
 vector vCell;
 Cell  cl;
 srand( (unsigned)time( NULL ) );
 for(int i=0;i<10; ++i)
 {
 cl.name=static_cast(i+'A');
 cl.time=static_cast(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() ) );
 output(vCell);

 vector::const_iterator iter=find_if( vCell.begin() , vCell.end() ,
   bind2nd(comper_mem_data(&Cell::name , equal_to() ),cl )
 );
 cout<

 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
//*/

//用同樣的方法,還可以製作出比較兩個類成員函式返回值的泛型類,
// 類資料成員 與 同型別的常數引數相比較的泛型類來。
//此處不一一列出。

//以上不當之處,還請各位大蝦不吝指教。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-982119/,如需轉載,請註明出處,否則將追究法律責任。

相關文章