std::unordered_set 个指针

std::unordered_set of pointers

我有以下结构

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

--- 编辑 ---

如果在 class 中声明 operator== 调试永远不会中断,但我认为因为 MyClass == MyClass* 永远不会发生...

struct MyClass {
    ...
    ...
    bool operator==(MyClass* const& c) {
        return this->myInt == c->myInt & this->myMap == c->myMap;
    }
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;

应该这样做:

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&。考虑一下,这是一种奇怪的编码风格,所以我将其更改为按值传递指针。

If declare operator== inside the class debug never breaks, but I think 'cause MyClass == MyClass* never happens...

unordered_set需要使用operator==(或PointedObjEq)对哈希函数的结果进行复核。哈希提供近似等式,等式函数用于剔除误报。

如果您测试过将相同的值添加到集合中两次,那么您就测试过相等函数。可以肯定的是,当然,你可以让它在控制台打印一些东西。

因为不可能用两个指针操作数定义operator== 函数,所以PointedObjEq class 将是必要的。请注意,它在两边都需要一个 MyClass const * 。此外,无需使用对指针的引用。

所以,

struct PointedObjEq {
    bool operator () ( MyClass const * lhs, MyClass const * rhs ) const {
        return lhs->myInt == rhs->myInt
            && lhs->myMap == rhs->myMap;
    }
};