在实践中,什么时候必须使用 `std::unordered_map` 而不是 `std::map`?

In practice, when `std::unordered_map` must be used instead of `std::map`?

在实践中,是否存在必须使用std::unordered_map而不是std::map的情况?

我知道它们之间的区别,比如内部实现,搜索元素的时间复杂度等等。

但是我实在找不到std::unordered_map确实不能被std::map代替的情况

是的,例如,如果键类型没有合理的严格弱排序但确实具有合理的相等性并且是可散列的。

有序关联容器 std::setstd::map.

上的键类型需要严格的弱顺序

我的意见是你应该改变问题:

when std::map must be used instead of std::unordered_map?

的确,std::unordered_map的插入、删除、查找没有std::map复杂。 this question 的 table 恢复每个操作的复杂性。

因此,至少在两种情况下建议使用 std::map

  1. 当您需要订购时
  2. std::unordered_map 是基于散列的。当你有太多的冲突而你找不到一个 suitable 哈希函数时,你可能会去寻找一个 std::map.

不过一般情况下,对于单元素操作,我推荐std::unordered_map

I know the difference between them, say internal implementation,time complexity for searching element

那么你应该知道无序map的平均渐近元素查找时间复杂度是常数,而有序map的复杂度是对数的。这意味着存在一定大小的容器,此时使用无序映射时查找速度会更快。

But I really can't find a circumstance where std::unordered_map could not be replaced by std::map indeed.

如果容器足够大,如果你负担不起有序映射查找的成本,那么你不能选择替换更快的无序映射查找。

无法使用有序映射的另一种情况是不存在用于比较键的相对顺序的廉价函数。