我对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个


我究竟做错了什么?
有人可以帮我吗?谢谢!

最佳答案

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 << " ";
}




注意:

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

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

关于c++ - qSort问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24969559/

10-12 23:56