c++ - 如何检索无序 map 的碰撞?

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

我有两个元素(6 和 747)共享它们的 key (“eggs”)。我想找到共享一个键的所有元素(假设是“鸡蛋”,但在现实生活中我会为每个键都这样做)。如何做到这一点?

必须有一种方法可以从数据结构中取回容器或其他东西。 . .

最佳答案

您仍然将键的 误认为是键的散列。但要回答所问的问题:您可以将 unordered_mapbucket() 成员函数与桶迭代器一起使用:

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';
}

demo

用简单且基本正确的术语来说,无序容器在接口(interface)方面模仿有序容器。这意味着如果 map 不允许您有重复键,那么 unordered_map 也不允许。

unordered 确实使用散列函数来加速查找,但是如果两个键具有相同的散列值,则它们不一定具有相同的值。为了保持与有序容器相似的行为,unordered_setunordered_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);

但是如果你想在同一个映射中允许重复键,只需使用 unordered_multimap

关于c++ - 如何检索无序 map 的碰撞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40710592/

相关文章:

java - 检查两个矩形是否重叠

algorithm - 有效找到高密度区间的最佳数据结构

hash - SHA1哈希是否均匀分布?

c++ - 比较类的 vector 时如何定义运算符 ==?

c++ - 如何在 C++11 中创建我自己的 initializer_list 类?

c++ - 在MFC中捕获鼠标指针形状变化事件

c++ - 在 Linux 中使用 C/C++ 获取机器序列号和 CPU ID

data-structures - 具有最大 api 的双端队列?

java - 在不覆盖哈希方法的情况下删除重复项

python在不同的执行中设置散列