qSort的问题

时间:2014-07-26 09:27:26

标签: c++ qt qsort

我对qSort有点问题。 我只想在将一个顶点添加到我的QList m_acceptedVertices后对我的列表进行排序。

bool Vertex::greaterThan(Vertex * v1, Vertex *v2){

    return this->computeDistanceTo(v1) > this->computeDistanceTo(v2);
}

void Vertex::acceptVertex(Vertex* vert)
{

    m_acceptedVertices.append(vert);

    qSort(m_acceptedVertices.begin(), m_acceptedVertices.end(), greaterThan);

}

但我仍然遇到这些错误:

  

Fehler:C3867:' Vertex :: greaterThan':函数调用缺失参数   列表;使用'& Vertex :: greaterThan'创建指向成员的指针

     

Fehler:C2780:' void qSort(Container&)' :期望1个参数 - 3个提供

     

Fehler:C2780:' void qSort(RandomAccessIterator,RandomAccessIterator)' :期望2>参数 - 3提供

我做错了什么? sombody可以帮帮我吗?谢谢!

2 个答案:

答案 0 :(得分:2)

1)你有一个设计问题,你的比较器应该是一个比较2 Vertex的自由函数(或函子),你的实现应该看起来像:

bool greaterThan(Vertex * v1, Vertex *v2){

    return v1.computeDistanceTo(v2) > 0;
}

2)使用标准库:std::sort(在大多数情况下,最有可能在内部执行快速排序,但如果您真的想使用qSort,则也会起作用)


带有自由功能比较器的

Minimal working example

class Vertex {
    public:
     int i;
};

bool greaterThan(Vertex * v1, Vertex *v2)
{
    return v1->i > v2->i;
}

int main()
{
    std::vector<Vertex*> v;
    v.push_back(new Vertex { 5 });
    v.push_back(new Vertex { 1 });
    v.push_back(new Vertex { 3 });
    v.push_back(new Vertex { 6 });
    v.push_back(new Vertex { 2 });

    std::sort(v.begin(), v.end(), &greaterThan);

    for(auto& ve : v)
       std::cout << ve->i << " ";
}

注意:

对于简单的比较函数,lambdas是一个很好的选择:

std::sort(v.begin(), v.end(), [] (Vertex * v1, Vertex *v2) {return v1->i > v2->i;} );

答案 1 :(得分:2)

如果你使用的是C ++ 11,那么你可能需要这样的东西:

void Vertex::acceptVertex(Vertex* vert)
{
    m_acceptedVertices.append(vert);

    qSort(hallo.begin(), hallo.end(), 
          [this](Vertex* v1, Vertex* v2) {
               return this->computeDistanceTo(v1) > this->computeDistanceTo(v2);
          });
}

如果使用较旧的C ++,则必须定义将存储指针引用Vertex的functor对象,或者使用boost中的lambda表达式。