gpt4 book ai didi

c++ - 使用比较器对指向对象的指针列表进行排序

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:45:35 25 4
gpt4 key购买 nike

我有一个类,它有指向对象的指针列表,这些对象需要用属于此类的成员的比较器进行排序:

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::sort(不接收 1 个参数)。

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

最佳答案

sort 需要一个双参数比较函数,但作为成员函数的声明导致调用类似于:

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

没有理由让 compairingPointsPredicate 成为一个类的成员。您可以使它成为一个独立的功能(如果需要访问私有(private)数据,则可以使用 QPointF 的 friend )。

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);

关于c++ - 使用比较器对指向对象的指针列表进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22275181/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com