簡體   English   中英

使用向量中的對象排序

[英]Sorting using objects in vector

我想修改以下代碼,以便我可以使用對象排序。 排序返回單個值的單個方法時,當前代碼很好。 如何實現使用返回對象的方法;

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()方法返回一個Point2D對象,該對象包含int x和int y的值;

如果你可以使用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 ) );

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);

根據您的要求,這些只是一堆一線或兩線。 不需要模板。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM