std :: unordered_set指针

时间:2015-07-25 15:46:12

标签: c++ hash set

我有以下结构

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;
    }

3 个答案:

答案 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;
    }
};

您的解决方案无效的原因是您实际上已经有效地编写了一种机制来将MyClassMyClass*进行比较,当您确实需要将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;