分享
 
 
 

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

王朝other·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

//最近在工作中,遇到这样一个问题:

//一个类中有十几个成员数据,我需要根据不同的成员提供不同的排序方法. 如下:

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

//*/

//用同样的方法,还可以制作出比较两个类成员函数返回值的泛型类,

// 类数据成员 与 同类型的常数参数相比较的泛型类来。

//此处不一一列出。

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有