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;
作为一个附带的好处,您不需要考虑动态分配和解除分配(在这种情况下,这可能是一个问题)。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- C++将浮点指针值舍入为小数位数
- 为什么++(*p)更改指针值
- 调整大小后指向元素值的指针unordered_map有效?
- 正在将指针转换为范围
- 使用指向成员的指针将成员函数作为参数传递
- 将OpenCV C++重写为EmguCV C#-如何使用指针
- QMultiHash和类指针的值