2016-01-21 85 views
0

我需要比较2 std :: unordered_map以检查它们是否具有相同的键和相应的值。C++ compare unordered_map hash keys

地图键是字符串,并获得一些性能我想知道是否有可能比较他们的计算散列而不是原始字符串值(不关心由于碰撞可能的“误报”)。

有没有简单的方法来实现这一目标? 喜欢的东西:

std::unordered_map<std::string, MyClass*> map1; 
std::unordered_map<std::string, MyClass*> map2; 
[...] 

// make sure maps have the same size 
auto itor1 = map1.begin(); 
auto itor2 = map2.begin(); 
while(itor1 != map1.end()){ 

    // compare itor1 and itor2 hashed key 
    ++itor1; ++itor2;  
} 
+1

这个不清楚。 '比较'地图是什么意思?您是否试图查看一张地图中存在的钥匙是否也出现在另一张地图中?不仅仅是迭代第一张地图,并且每个键都会在另一张地图上找到()。这将是最快的方式。 – SergeyA

+0

这就是我现在要做的。我想知道哈希是否存储/访问到任何地方,因此遍历映射并比较它们,节省了键散列和查找()每个条目的时间。 – rickyviking

回答

1

大多数哈希表实现不存储特定项目的计算哈希值的任何地方。散列仅用于派生存储桶。而且由于这两个地图的桶数可能不同,所以甚至无法通过桶索引进行比较。

所以,底线:你不能这样做。

1

你可以解决这个问题的一种方法是在地图中使用一对作为你的值。这一对可以由你的散列值的类型和你的数据的类型组成。当插入你的地图时,散列密钥并将它与你的数据作为一对传递。然后你可以做键哈希比较。正如上面有人所说,散列值不会被存储,因为它们只在访问时才使用。

这就是说,哈希根据容器的大小而变化,所以你会遇到其他问题。