C++ std::vect使用成员变量排序
我被这段代码困住了:C++ std::vect使用成员变量排序,c++,sorting,vector,std,member-functions,C++,Sorting,Vector,Std,Member Functions,我被这段代码困住了: class MyObject { public: int value; } class MyClass { private: btAlignedObjectArray<MyObject*> m_objects; public: int comp (MyObject *a, MyObject *b) { return calculateTheNewValue(a->value) < calculat
class MyObject
{
public:
int value;
}
class MyClass
{
private:
btAlignedObjectArray<MyObject*> m_objects;
public:
int comp (MyObject *a, MyObject *b)
{
return calculateTheNewValue(a->value) < calculateTheNewValue(b->value);
}
void doSort()
{
m_objects.quickSort(comp);
}
//edit: this member function is needed to do the sorting
int calculateTheNewValue(int v)
{
// do some calculation using other members variables, not necessarily m_objects
}
};
编辑
这是btAlignedObjectArray的声明
第365行有声明或
快速排序如果需要将comp
转换为二进制函数,则将其包装在函子中。如果可以使用C++11,请使用lambda:
m_objects.quickSort([&](MyObject * lhs, MyObject * rhs) {
return this->comp(lhs,rhs)
});
如果不能使用C++11,则创建一个具有类似行为的函子类
struct compare
{
MyObject & obj_;
compare(MyObject& obj) :obj_(obj) {}
bool operator()(MyObject * lhs, MyObject * rhs) const {
return obj_.comp(lhs,rhs);
}
};
...
void doSort()
{
m_objects.quicksort(compare(*this));
}
comp不需要任何对m_对象的访问,因为您已经传递了应该相互比较的对象。你确定这个例子是完整的吗?@j_schultz对不起,我遗漏了代码的一个重要部分,可能是咖啡太多(或太少)。calculateTheNewValue()是执行排序显示声明所需的成员函数,btAlignedObjectArray::quickSort
。如果calculateTheNewValue不引用m_对象,则comp和calculateTheNewValue可以是静态的。@lulyon calculateTheNewValue计算引用其他成员变量的值,我必须编辑以澄清我使用的是Xcode 4.6,它无法识别[&](x,y){…}语义,我将尝试函子方法,顺便问一下,它是如何调用的,它是一种作为parameter@rraallvv:你是说那句话叫什么?它叫a。@rraallvv:顺便说一下,我不使用XCode,但我很确定它支持C++11,您只需要启用它。检查这个:lambda方法起作用了,Xcode在其他文件中显示了一些其他错误,但是我可以尝试只为这个文件启用c++11
struct compare
{
MyObject & obj_;
compare(MyObject& obj) :obj_(obj) {}
bool operator()(MyObject * lhs, MyObject * rhs) const {
return obj_.comp(lhs,rhs);
}
};
...
void doSort()
{
m_objects.quicksort(compare(*this));
}