我理解当使用带有自定义类的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
类一起工作吗?