该标准或多或少要求使用存储桶解决冲突,这意味着实际查找时间可能与存储桶中的元素数量成线性关系,无论该元素是否存在。可以使它成为 O(lg N),但通常不会这样做,因为如果正确使用哈希表,桶中的元素数量应该很少。
为了保证一个桶的元素数量少,必须保证散列函数是有效的。有效的手段取决于被散列的类型和值。(MS 实现使用 FNV,这是最好的通用散列之一,但如果您对将要看到的实际数据有专门的了解,您可能会做得更好。)另一件可以帮助减少数量的事情每个桶的元素数量是强制更多的桶或使用更小的负载因子。首先,您可以将最小初始桶数作为参数传递给构造函数。如果您知道地图中的元素总数,则可以通过这种方式控制负载因子。填满表格后,您还可以通过调用
rehash. 否则,有一个功能
std::unordered_map<>::max_load_factor你可以使用它。它不能保证做任何事情,但在任何合理的实施中,它会。请注意,如果您在已填充的 上使用它unordered_map,您可能必须在
unordered_map<>::rehash之后调用。
(关于标准 unordered_map 有几件事我不明白:为什么负载因子是 a float,而不是
double;为什么它不需要产生影响;以及为什么它不会自动调用rehash你。)