2012-11-15 73 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'來代替? –