0

考虑以下小代码:

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 键迭代条目?

4

2 回答 2

0

您可以为 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;
};

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

于 2013-12-16T15:47:45.563 回答
0

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

QMultiHash<int, Person> personHash; 

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

于 2013-12-17T16:59:08.873 回答