Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用向量中的对象进行排序_C++_Templates_Sorting_Stdvector - Fatal编程技术网

C++ 使用向量中的对象进行排序

C++ 使用向量中的对象进行排序,c++,templates,sorting,stdvector,C++,Templates,Sorting,Stdvector,我想修改以下代码,以便可以使用对象进行排序。 对返回单个值的单个方法进行排序时,当前代码没有问题。 如何使用返回对象的方法实现 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)(

我想修改以下代码,以便可以使用对象进行排序。 对返回单个值的单个方法进行排序时,当前代码没有问题。 如何使用返回对象的方法实现

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);
 }
//我想实施这个

 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)

&


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

AFAICS,您可以让代码保持原样。必须定义的唯一内容是
Point2D
或返回的任何对象的比较运算符:

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


根据您的需求,这些只是一堆一两行程序。不需要模板。

实现一行小代码不是更容易吗operator@JoachimPileborg我使用4个不同的citiera对4个不同的类进行排序,我使用的是模板。要使其成为泛型。@JoachimPileborg,或者我可以实现一个不同的函数来比较对象吗?我不能使用boost。我使用模板的原因是,我有4个类需要使用不同的citeria进行排序。@user1571494如果您使用的是启用C++11的编译器,您可以使用
std::bind
class Point2D {
public:
    friend bool operator<(const Point2D &p1, const Point2D &p2) { ...; }
    ...
};
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);