使用smart pointer对STL list排序
简单数据类型,直接调用list::sort(),复杂数据类型需要重载operator<和operator>
尤其是定义的list的element不是对象,是指针时,需要用到借助smart Pointer来实现
一个简单的例子,源码如下,按照hit_排序:
class Service
{
public:
Service(){};
virtual ~Service(){};
inline int GetHit() { return hit_; };
inline void SetHit(int hit) { hit_ = hit; };
friend bool ServiceCompareUp(const Service *s1,const Service *s2) {return s1->GetHit() < s2->GetHit(); }; //up
friend bool ServiceCompareDown(const Service *s1,const Service *s2) {return s1->GetHit() > s2->GetHit(); }; //Down
private:
int hit_;
};
//定义模板如下
template<class T>
class SmartPtr
{
public:
T *ptr;
SmartPtr(T* p=0):ptr(p) {};
SmartPtr(const SmartPtr<T> &p):ptr(p.ptr){};
SmartPtr<T>& operator=(const SmartPtr<T>&p)
{
if(this !=&p)
{
ptr = p.ptr;
}
return *this;
}
~SmartPtr() {};
T& operator*() const { return *ptr;};
T& operator->() const { return ptr;};
};
//实例化
bool ServiceCompareUp(const Service *s1,const Service *s2);
bool ServiceCompareDown(const Service *s1,const Service *s2);
class ServicePtr : public SmartPtr<Service>
{
public:
ServicePtr(Service *p):SmartPtr<Service>(p){ };
bool operator<(const ServicePtr& rhs) const
{
return ServiceCompareUp((*this).ptr , rhs.ptr); //升序
};
bool operator>(const ServicePtr& rhs) const
{
return ServiceCompareDown((*this).ptr , rhs.ptr); //降序
};
};
//main
main()
{
list <Service *> srvlist;
Service * tmpsrv;
For(int i=0;i<100;i++)
{
tmpsrv = new Service;
if(NULL != tmpsrv)
{
tmpsrv.SetHit(i);
srvlist.push_back(tmpsrv);
}
}
//降序
greater<ServicePtr> ptr;
srvlist.sort(ptr);
list<Service *>::iterator it=srvlist.begin()
for( ; it!=srvlist.end();++it)
{
cout<<(*it)->GetHit() <<endl;
}
}