如何检索无序地图的碰撞?

时间:2016-11-20 23:18:09

标签: c++ data-structures hash stl hash-collision

我有两个元素(6和747)共享他们的键(" egg")。我想找到共享密钥的所有元素(让我们说"鸡蛋",但我会在现实生活中为每个密钥执行此操作)。怎么做?

必须有办法从数据结构中获取容器或其他东西。 。

2 个答案:

答案 0 :(得分:2)

你还在用密钥的哈希误认为密钥的。但是要回答问题:你可以使用unordered_map的{​​{1}}成员函数和桶迭代器:

bucket()

demo

在简单且大多数正确的术语中,无序容器在界面方面模仿其有序对应物。这意味着,如果std::unordered_map<int,int,dumbest_hash> m; m[0] = 42; m[1] = 43; size_t bucket = m.bucket(1); for(auto it = m.begin(bucket), e = m.end(bucket); it != e; ++it) { cout << "bucket " << bucket << ": " << it->first << " -> " << it->second << '\n'; } 不允许您拥有重复的密钥,则map也不会。

unordered_map使用散列函数来加速查找,但如果两个键具有相同的散列,则它们不一定具有相同的值。为了使行为与有序容器保持类似,unorderedunordered_set只会在实际上相等时使用相等的元素(使用unordered_map或提供的比较器),而不是当它们的散列值发生碰撞时

为了正确看待问题,我们假设operator=="eggs"具有相同的哈希值,并且没有相等性检查。然后以下代码将是“正确的”:

"chicken"

但是如果你想在同一张地图中允许重复的密钥,只需使用unordered_map<string, int> m; m["eggs"] = 42; m.insert(make_pair("chicken", 0)); // not inserted, key already exists assert(m["chicken"] == 42);

答案 1 :(得分:2)

无序地图没有共享密钥的元素。

无序多地图确实。

使用umm.equal_range(key)获取pair个迭代器,描述地图中与给定键匹配的元素。

但是,请注意,在谈论散列容器时,“碰撞”通常是指具有相同散列键的元素,而不是相同的键。

另外,请考虑使用unordered_map<key, std::vector<value>>代替多地图。