我有一个班级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(), ??? );
我试过像
这样的approchessort 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() );
答案 0 :(得分:1)
错误是因为您从比较器函数的静态上下文访问非静态成员d
。使用第二种方法,采用以下方式:
unsigned int
并将成员设置为该值。compareMyDataFunctor
类型的对象,并将d
的值传递给构造函数。答案 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
(我假设你从代码中的声明中做到)。这就是我所能想到的。下次尝试呈现short, self contained, complete examples时,人们不必诉诸猜测。