我有两个元素(6和747)共享他们的键(" egg")。我想找到共享密钥的所有元素(让我们说"鸡蛋",但我会在现实生活中为每个密钥执行此操作)。怎么做?
必须有办法从数据结构中获取容器或其他东西。 。
答案 0 :(得分:2)
你还在用密钥的哈希误认为密钥的值。但是要回答问题:你可以使用unordered_map
的{{1}}成员函数和桶迭代器:
bucket()
在简单且大多数正确的术语中,无序容器在界面方面模仿其有序对应物。这意味着,如果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
使用散列函数来加速查找,但如果两个键具有相同的散列,则它们不一定具有相同的值。为了使行为与有序容器保持类似,unordered
和unordered_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>>
代替多地图。