如何为指针的 QList 编写自定义比较器

How to write a custom comparator for a QList of pointers?

本文关键字:自定义 比较器 QList 指针      更新时间:2023-10-16

我有一个QList<MyPoint*> l,其中MyPoint是一个用户反抗类类型,我想这样做:

 QList<MyPoint*> l;
 MyPoint *a = new MyPoint(2, 4);
 MyPoint *b = new MyPoint(4, 8);
 MyPoint *c = new MyPoint(2, 4);
 l << a << b;

然后:

l.contains(c); //true

我尝试重载==运算符,如doc所说:

此函数要求值类型具有 运算符==()。

尝试了不同的方法,但似乎都没有按预期工作。

这是我到目前为止尝试过的代码:

class MyPoint
{
public:
    int x, y;
    MyPoint(int x, int y)
        : x(x),
          y(y)
    {
    }
    bool operator == (const MyPoint &other) const
    {
        return other.x == this->x && other.y == this->y;
    }
    bool operator == (const MyPoint *other) const
    {
        return true;
    }
};
bool operator == (const MyPoint &a, const MyPoint &b)
{
    return a.x == b.x && a.y == b.y;
}

我尝试了类似的东西:

bool operator == (const MyPoint *a, const MyPoint *b)
{
    return a.x == b.x && a.y == b.y;
}

但我读到这是不可能的...我知道(*a == *c)是正确的,但我希望它影响contains()行为,以便使用我自己的比较器进行比较。

运算符

== 重载仅适用于MyPointer对象的指针地址,而不适用于对象本身。

与其列出 MyPointer* 对象,不如尝试创建 MyPointer 对象列表(即 QList<MyPointer>)。不过,您必须确保重载赋值运算符和复制构造函数。

如果这变得过于昂贵,请考虑将您的类转换为使用隐式共享,就像大多数Qt数据类一样,通过使用QSharedDataQSharedDataPointer类。