c – 根据键的类型选择map或unordered_map

一个普遍问的问题是我们是否应该使用unordered_map或map来加快访问速度.
这个问题最常见(相当古老)的答案是:
如果要直接访问单个元素,请使用unordered_map,但如果要迭代元素(最有可能以排序方式),请使用map.

在做出这样的选择时,我们不应该考虑密钥的数据类型吗?
由于一个dataType(比如int)的哈希算法可能比其他(例如字符串)更容易发生冲突.

如果是这种情况(哈希算法很容易发生冲突),那么我可能会使用map甚至直接访问,因为在这种情况下,unordered_map map的O(1)常量时间(可能是大数量输入的平均值)是即使对于相当大的N值,也超过lg(N).

最佳答案
你提出了一个好点…但你关注的是错误的部分.

问题不在于密钥的类型本身,而在于用于导出该密钥的哈希值的哈希函数.

字典排序很容易:如果你告诉我你想根据它的3个字段订购一个结构(并且他们已经支持自己订购)那么我只会写:

bool operator<(Struct const& left, Struct const& right) {
    return boost::tie(left._1,  left._2,  left._3)
         < boost::tie(right._1, right._2, right._3);
}

我完成了!

但是编写哈希函数很困难.你需要一些关于数据分布的知识(统计数据),你可能需要防止特制的攻击等等……老实说,我不希望很多人能够制作出好的哈希函数.但最糟糕的是,成分也很难!给定两个独立的字段,将它们的哈希值组合起来很难(提示:boost :: hash_combine).

所以,实际上,如果您不知道自己在做什么,并且正在处理用户制作的数据,那么只需坚持使用地图即可.它可能更慢(不确定),但它更安全.

转载注明原文:c – 根据键的类型选择map或unordered_map - 代码日志