我有一个std::unordered_map
myMap
,其键值对为<Key*, Value>
。 Key
定义如下:
struct Key
{
unsigned long int UniqueValue;
unsigned long int NonnUniqueValue;
}
该计划的其余部分确保UniqueValue
对Key
的每个实例都是唯一的,但{}之间NonUniqueValue
可能不同。我的哈希函数定义为:
struct KeyHash
{
std::size_t operator()(const Key& k) const
{
return k.UniqueValue;
}
}
然后我的地图是:
std::unordered_map<Key*, Value, KeyHash> myMap;
因此,基本上,每个密钥已经知道它自己的哈希值。我希望能够通过Key
实例本身和UniqueValue
引用键值对。由于哈希值已经知道,我可以用它来直接引用值吗?
例如,如果我有Key
k1
和k2
两个k1.UniqueValue = 2
,k2.UniqueValue = 5
,k1.NonUniqueValue = 42
和{{}的实例1}},我希望能够引用k2.NonUniqueValue = 42
中的值myMap
只知道k1
。
这可以不直接修改k1.UniqueValue
吗?
答案 0 :(得分:0)
首先,一个小问题。您声明容器的方式:
std::unordered_map<Key*, Value, KeyHash> myMap
使地图键成为指针到Key
结构,而不是值。
现在,执行所需操作的最简单方法是重新组织哈希表:
std::unordered_map<
unsigned int /*unique_part_of_key*/,
std::pair<unsigned int /*non_unique_part_of_key*/, Value>>
要完全按照您的要求进行操作,您需要添加一个自定义KeyEqual谓词,忽略键的非唯一部分,就像您的KeyHash一样。然后,您可以使用随机的非唯一值创建一个假的Key实例,并使用它来检索所需的引用:
struct KeyEqual
{
bool operator(const Key& k1, const Key& k2) const
{ return k1.UniqueValue == k2.UniqueValue; }
};
std::unordered_map<Key*, Value, KeyHash, KeyEqual> myMap{KeyHash(), KeyEqual()};