考虑以下小代码:
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;
作为一个附带的好处,您不需要考虑动态分配和解除分配(在这种情况下,这可能是一个问题)。