2012-11-15 69 views
0

我想修改下面的代码,以便我可以使用对象进行排序。 排序返回单个值的单个方法时,当前的代码很好。 如何使用返回对象的方法实现;使用向量排序使用对象

template<typename T, typename M, template<typename> class C = std::less> 
struct method_comparer : std::binary_function<T, T, bool> 
{ 
explicit method_comparer(M (T::*p)() const) : p_(p) { } 

bool operator()(T const& lhs, T const& rhs) const 
{ 
return C<M>()((lhs.*p_)(), (rhs.*p_)()); 
} 

private: 
M (T::*p_)() const; 
}; 



template<typename T, typename M> 
method_comparer<T, M> make_method_comparer(M (T::*p)() const) 
{ 
return method_comparer<T, M>(p); 
} 

template<template<typename> class C, typename T, typename M> 
method_comparer<T, M, C> make_method_comparer2(M (T::*p)() const) 
{ 
return method_comparer<T, M, C>(p); 
} 

Main.cpp的

// works well 
std::sort(vec_p2d.begin(),vec_p2d.end(),make_method_comparer(&Point2D::getX)); 

//想实现此

std::sort(vec_l2d.begin(),vec_l2d.end(),make_method_comparer(&Line2D::getPt1)); 

getPt1()方法返回其包含对于int x和INT y中的值的Point2D对象;

+0

仅仅为你的类实现一个小的单行'运算符<'是不是更容易? –

+0

@JoachimPileborg我正在使用4个不同的citiera对4个不同的类进行排序,我使用的是模板。使通用。 –

+0

@JoachimPileborg或者我可以只是实现一个不同的功能只是为了比较对象 –

回答

1

AFAICS,你可以保留你的代码。你必须定义的唯一的事情是Point2D比较运营商或任何物体你返回:

class Point2D { 
public: 
    friend bool operator<(const Point2D &p1, const Point2D &p2) { ...; } 
    ... 
}; 

您也可以删除您method_comparer类,只是给予适当的比较器功能进行排序:

bool compare_line_points(const Line2D &l1, const Line2D &l2) { 
    return l1.getPt1() < l2.getPt1(); 
} 

std::sort(vec_l2d.begin(), vec_l2d.end(), compare_line_points); 

根据您的要求,这些只是一束或一两行。无需模板。

1

如果你可以使用boost,怎么样:

std::sort(vec_p2d.begin(), vec_p2d.end(), boost::bind(&Point2D::getX, _1) < boost::bind(&Point2D::getX, _2));

&

std::sort(vec_p2d.begin(), vec_p2d.end(), boost::bind(&Point2D::getPt1, _1) < boost::bind(&Point2D::getPt1, _2));

+0

我不能使用提升。我使用模板的原因是,我有4个需要使用不同的citeria进行排序的类。 –

+1

@ user1571494如果您使用的是支持C++ 11的编译器,那么您可以使用'std :: bind'来代替? –