依據類的成員來對類進行排序的泛型方法 (轉)
//最近在工作中,遇到這樣一個問題:
//一個類中有十幾個成員資料,我需要根據不同的成員提供不同的排序方法. 如下:
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
{
return Comp_Mem_Data
}
template
Comp_Mem_Data
{
return Comp_Mem_Data
}
//以下就可以開始比較了.
// 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<
<
}
template
void output(Container cont)
{
cout< for(int j=0;j
int main()
{
vector
Cell cl;
srand( (unsigned)time( NULL ) );
for(int i=0;i<10; ++i)
{
cl.name=static_cast
cl.time=static_cast
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 char lc; //程式的一個輸出如下: //用同樣的方法,還可以製作出比較兩個類成員函式返回值的泛型類, //以上不當之處,還請各位大蝦不吝指教。
bind2nd(comper_mem_data(&Cell::name , equal_to
);
cout<
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 使用XPathExpression類對XML進行排序 (轉)ExpressXML排序
- 泛型類和泛型方法泛型
- 我談給類成員陣列進行大批賦值的方法 (轉)陣列賦值
- 泛型類、泛型方法及泛型應用泛型
- 泛型類、泛型方法、型別萬用字元的使用泛型型別字元
- 泛型類及系統中常用的泛型類泛型
- 對於靜態成員來說是類的建構函式,對於例項成員是類的原型物件。函式原型物件
- 如何用反射呼叫泛型類的方法反射泛型
- Java泛型知識點:泛型類、泛型介面和泛型方法Java泛型
- 【譯】在非泛型類中建立泛型方法泛型
- Wait Events的分類及分類依據AI
- 泛型類派生子類泛型
- 用java.util.Collections中的sort方法對兩個類的物件進行排序Java物件排序
- Python的靜態方法和類成員方法Python
- JAVA泛型類Java泛型
- TypeScript 泛型介面和泛型類TypeScript泛型
- 對於ArrayList中的泛型進行分析泛型
- CWinApp類成員 (轉)APP
- c# 基類派生類成員方法訪問C#
- MFC之動態呼叫自己寫的類庫中的類的成員方法
- TS類,介面,泛型的簡介泛型
- 泛型,內部類泛型
- Java的靜態成員類Java
- 【python】類的特殊成員Python
- Java 通過反射獲取類的資訊(成員變數,成員方法,構造方法)Java反射變數構造方法
- Java泛型(類、介面、方法)及萬用字元Java泛型字元
- dart系列之:dart類中的泛型Dart泛型
- 集合框架-泛型類的概述及使用框架泛型
- 匿名內部類泛型泛型
- 泛型類序列化泛型
- 通過反射獲取類的類名,方法和內部成員變數反射變數
- 使用類繼承還是類的成員變數繼承變數
- c++類的靜態成員C++
- C++:類的成員函式C++函式
- C++:類的靜態成員C++
- 關於Java中類的成員Java
- C++ 類的靜態成員C++
- c#之arraylist類的成員C#