QMultiHash和类指针的值

QMultiHash and values of class pointers

本文关键字:指针 QMultiHash      更新时间:2023-10-16

考虑以下小代码:

class Person {
public:
    QString name;
    int age;
};
int main()
{
    QMultiHash<int, Person*> personHash;
    Person* p1 = new Person;
    p1->age = 24;
    p1->name = "X";
    personHash.insert(p1->age,p1);
    Person* p2 = new Person;
    p2->age = 24;
    p2->name = "X";
    if(personHash.contains(p2->age,p2)) {
        cout << "Duplicate!!n";
    }
    else {
        cout << "Inserted!!n";
    }
    return 0;
}

输出是插入的,这是意料之中的事,因为哈希比较的是指针值,而不是内容。

有没有一种方法可以在不需要迭代键为24的条目的情况下检查重复项?

您可以为Person添加一个包装器,该包装器将存储指针并提供比较运算符,并按值将该包装器存储在哈希中。

class PersonPtr {
public:
   PersonPtr(Person* ptrIn) : ptr(ptrIn) {};
   Person* getPtr() { return ptr;}
   bool operator ==(const PersonPtr &other)
   {
      return (other.getPtr()->name == ptr->name && other.getPtr()->age == ptr->age);
   }
private:
   Person* ptr;
};

您只需要小心避免内存泄漏——要么使用共享指针,要么为包装类编写自己的赋值并复制构造函数+析构函数。

当然是插入的。因为你比较的是指针(即内存中的地址),而不是人对象。指针p1当然不同于p2。最简单的解决方案是在容器中存储值而不是指针:

QMultiHash<int, Person> personHash; 

作为一个附带的好处,您不需要考虑动态分配和解除分配(在这种情况下,这可能是一个问题)。