C ++使用带有自定义类的unordered_map作为键,提供Hash仿函数和等式仿函数

时间:2018-01-15 14:55:51

标签: c++ unordered-map

我理解当使用带有自定义类的unordered_map / unordered_set作为键时,我需要为键提供哈希函数,并且需要一个函数来比较两个键是否相等。但是,我还没有弄清楚为什么我的设置无效:

struct RandomListNode {
    int label;
    RandomListNode *next, *random;
    RandomListNode(int x) : label(x), next(NULL), random(NULL) {}
};

struct MyHash {
    size_t operator()(const RandomListNode& node) const {
        return (size_t)(&node) + node.label;
    }
};

struct KeyEqual {
    bool operator()(const RandomListNode& node1, const RandomListNode& node2) const {
        return (&node1 == &node2) && (node1.label == node2.label);
    }
};

...

unordered_map<RandomListNode, RandomListNode, MyHash, KeyEqual> originalToCopy;

给了我

11. In instantiation of template class 'std::__1::unordered_map<RandomListNode, RandomListNode, std::__1::hash<RandomListNode>, std::__1::equal_to<RandomListNode>, std::__1::allocator<std::__1::pair<const RandomListNode, RandomListNode> > >' requested here

编辑1

我想我发现了它之前没有工作的原因:

我在做

    for (unordered_map<RandomListNode, RandomListNode>::value_type value : originalToCopy)
    {
        value.second.random = &originalToCopy[*(value.first.random)];
    }

而我应该这样做

    for (unordered_map<RandomListNode, RandomListNode, MyHash, KeyEqual>::value_type value : originalToCopy)
    {
        value.second.random = &originalToCopy[*(value.first.random)];
    }

但是我还想问一下另一件事,如果RandomListNode类没有提供默认构造函数,或者复制构造函数,或者移动构造函数,那么它就是我的类我无法修改,当一个密钥不存在并且我想创建一个密钥时,我无法使operator[]emplace()unordered_map类一起工作吗?

0 个答案:

没有答案