我有以下结构
struct MyClass {
int myInt;
std::map<int, int> myMap;
};
我想使用unordered_set<MyClass*, PointedObjHash, PointedObEq>
但我无法找到宣告PointedObEq
的有效方式。
我试过
struct PointedObjHash {
size_t operator() (MyClass* const& c) const {
std::size_t seed = 0;
boost::hash_combine(seed, c->myInt);
boost::hash_combine(seed, c->myMap);
return seed;
}
我希望它没事,但我找不到申报PointedObjEq
---编辑---
如果在类中声明operator ==,调试永远不会中断,但我认为因为MyClass == MyClass *永远不会发生...
struct MyClass {
...
...
bool operator==(MyClass* const& c) {
return this->myInt == c->myInt & this->myMap == c->myMap;
}
答案 0 :(得分:4)
如果在类中声明operator ==,调试永远不会中断,但我认为'因为MyClass == MyClass *永远不会发生......
unordered_set
需要使用operator==
(或PointedObjEq
)来仔细检查哈希函数的结果。哈希提供近似相等,相等函数用于清除误报。
如果您已经测试过两次向集合中添加相同的值,那么您已经测试了相等函数。当然,当然,您可以将它打印到控制台。
由于无法使用两个指针操作数定义operator==
函数,因此PointedObjEq
类是必需的。请注意,双方都需要MyClass const *
。此外,不需要使用对指针的引用。
所以,
struct PointedObjEq {
bool operator () ( MyClass const * lhs, MyClass const * rhs ) const {
return lhs->myInt == rhs->myInt
&& lhs->myMap == rhs->myMap;
}
};
答案 1 :(得分:1)
这应该做:
struct PointedObEq {
bool operator()(MyClass const * lhs, MyClass const * rhs) const {
return lhs->myInt == rhs->myInt && lhs->myMap == rhs->myMap;
}
};
您的解决方案无效的原因是您实际上已经有效地编写了一种机制来将MyClass
与MyClass*
进行比较,当您确实需要将MyClass*
与MyClass*
。
P.S。:我的原始答案通过了const&
的指针。考虑到这一点,这是一种奇怪的编码风格,所以我改变它以按值传递指针。
答案 2 :(得分:0)
typedef MyClass* PtrMyClass;
struct PointedObjCompare
{ // functor for operator==
bool operator()(const PtrMyClass& lhs, const PtrMyClass& rhs) const
{
// your code goes here
}
};
std::unordered_set < MyClass*, PointedObjHash, PointedObjCompare > myset;