带有类向量的c ++排序类

时间:2012-06-17 12:22:54

标签: c++ class sorting vector

我有一个班级cl1:

class c1
{
long double * coords;
...
}

我还有第二类cl2:

class cl2
{
vector<cl1*> cl1_vec;
unsigned int d;
...
}

我想基于coords [d]从cl2中对cl1_vec进行排序,使用向量的sort函数。 所以我可以有像

这样的东西
sort(cl2_inst->cl1_vec.begin(),cl2_inst->cl1_vec.end(), ??? );

我试过像

这样的approches

sort the 'std::vector' containing classes

C++ std::sort with predicate function in Class

但是我无法解决这个问题。

感谢您提供任何帮助。

我试过的代码:

class cl1 {
    public:
        long double* coords;

        cl1(long double *, unsigned int);
        cl1();
        cl1(const cl1& orig);
        virtual ~cl1();        
};

class cl2 {

    public:

    unsigned int d;

    vector<cl1*> cl1_vec;

    //the srting functions
    static bool compareMyDataPredicate(cl1* lhs, cl1* rhs)
    {
        return (lhs->coords[d] < rhs->coords[d]);
    };
    // declare the functor nested within MyData.
    struct compareMyDataFunctor : public binary_function<my_point*, my_point*, bool>
    {
        bool operator()( cl1* lhs, cl1* rhs)
        {
            return (lhs->coords[d] < rhs->coords[d]);
        }
    };
    ...
    ...
}

然后在主

    std::sort(cl2_inst->cl1_vec.begin(),cl2_inst->cl1_vec.end(),cl2::compareMyDataPredicate() );

2 个答案:

答案 0 :(得分:1)

错误是因为您从比较器函数的静态上下文访问非静态成员d。使用第二种方法,采用以下方式:

  • 为该结构提供构造函数,该构造函数接受参数unsigned int并将成员设置为该值。
  • 创建compareMyDataFunctor类型的对象,并将d的值传递给构造函数。
  • 使用此对象进行排序(第三个参数为std :: sort)

答案 1 :(得分:0)

我不确定这些问题,因为你不确切地知道在你的情况下究竟“不起作用”是什么意思(不编译,编译但不排序等)。如果它没有编译(很可能是猜测)你没有发布错误消息,这也使得查找和解释问题非常困难。

以下是根据您发布的代码进行的一些猜测:

静态函数和函子都使用成员d来决定要排序的列。但是d是一个实例变量,所以它不适用于任何静态的东西。仿函数和静态成员函数都不知道要使用哪个d,因为每个实例只有一个d

在不使用C ++ 11特性(lamdas)的情况下执行此操作的最佳方法是为仿函数提供构造函数,该构造函数采用您计划使用的d。像这样:

struct compareMyDataFunctor : public binary_function<cl1*, cl1*, bool>
{
    compareMyDataFunctor( unsigned int d ) : d( d ) {}
    bool operator()( cl1* lhs, cl1* rhs)
    {
        return (lhs->coords[d] < rhs->coords[d]);
    }

    unsigned int d;
};

这应该可以解决问题。

您发布的代码还有一些问题:

  • 应使用size_t类型而不是unsigned int对数组建立索引。 std::vector s
  • 也是如此
  • std::binary_function实例化中的类型与方法中的实际类型不匹配(可能是减少代码的问题)。
  • 不要使用using namespace std(我假设你从代码中的声明中做到)。
  • 这些函数应该将参数作为const-reference而不是值。

这就是我所能想到的。下次尝试呈现short, self contained, complete examples时,人们不必诉诸猜测。