将STD ::指针列表与比较器的对象列表

Sorting std::list of pointers to objects with comparator

本文关键字:列表 对象 比较器 指针 STD      更新时间:2023-10-16

我有一个类,该类上有针对对象的指针列表,而对象需要用比较器进行排序,而比较器是此类的成员:

class VoronoiDiagram
{
public:
    void BuildVoronoi();
private:
    list<shared_ptr<QPointF>> inputPoints
    QPointF currentVoronoiPoint;
    bool compairingPointsPredictate(shared_ptr<QPointF> a, shared_ptr<QPointF> b) {    float d1 = (a->x()-currentVoronoiPoint.x())*(a->x()-currentVoronoiPoint.x()) + (a->y()-currentVoronoiPoint.y())*(a->y()-currentVoronoiPoint.y());
                                                                                float d2 = (b->x()-currentVoronoiPoint.x())*(b->x()-currentVoronoiPoint.x()) + (b->y()-currentVoronoiPoint.y())*(b->y()-currentVoronoiPoint.y());
                                                                                return d1 < d2; };          
};

我在buildvoronoi()中打电话:

inputPoints.sort(compairingPointsPredictate);

但这给我两个错误:C3867带有我的比较器函数,c2660带有std :: list :: stort :: stort(请未收到1个参数)。

对不起我的英语或解释。我真的希望这里有人可以帮助我。谢谢。

sort需要两个参数比较函数,但声明为成员函数会导致呼叫类似:

a.compairingPointsPredicate( b, c)
//                     ^
//                   no 't', it is predicate not predictate ;p

没有理由使compairpointsspredicate成为班级的成员。您可以使其成为一个免费的常见功能(如果需要访问私有数据,则QPointF的朋友)。

class QPointF{
    friend bool compairingPointsPredicate(
                        shared_ptr<QPointF> a, shared_ptr<QPointF> b);          
};

bool compairingPointsPredicate(shared_ptr<QPointF> a, 
                                          shared_ptr<QPointF> b) {    
                                            float d1 = (a->x()-currentVoronoiPoint.x())
                                            *(a->x()-currentVoronoiPoint.x()) + 
                                            (a->y()-currentVoronoiPoint.y())
                                            *(a->y()-currentVoronoiPoint.y());
                                            float d2 = (b->x()-currentVoronoiPoint.x())
                                            *(b->x()-currentVoronoiPoint.x()) +
                                            (b->y()-currentVoronoiPoint.y())
                                            *(b->y()-currentVoronoiPoint.y());
                                            return d1 < d2;
}

用法:

inputPoints.sort(compairingPointsPredicate);