繁体   English   中英

std :: unordered_map是否相等取决于插入顺序

[英]Does std::unordered_map equality depend on insertion order

如果您使用相同的一组(非相等)键值对创建两个std::unordered_map容器,但以不同的顺序插入(因此,这些容器包含相等的元素,但可能以不同的顺序),则这些容器一定会等于,根据相等运算符( operator== )。 我假设容器元素的哈希码和相等运算符满足其实现上所有必需的约束。

是的,在这种情况下,可以保证它们返回相等。 具体措辞(摘自N4659,第[unord.req] / 12条)为:

如果a.size() == b.size() ,则两个无序容器ab比较相等,并且对于从a.equal_range(Ea1)获得的每个等效键组[Ea1, Ea2) a.equal_range(Ea1) ,存在一个等效键组从b.equal_range(Ea1) [Eb1, Eb2)获得的[Eb1, Eb2) ,这样is_permutation(Ea1, Ea2, Eb1, Eb2)返回true

因此,只要其中一个的键(和关联的值)与另一个相同(但可能以不同的排列顺序),它就会比较相等。

来自[unord.red] / 12

如果a.size() == b.size() ,则两个无序容器ab比较相等,并且对于从a.equal_range(Ea1)获得的每个等效键组[Ea1, Ea2) a.equal_range(Ea1) ,存在一个等效键组从b.equal_range(Ea1) [Eb1, Eb2)获得的[Eb1, Eb2) ,这样is_permutation(Ea1, Ea2, Eb1, Eb2)返回true [...]

因此,只要密钥相同且大小相同,无论密钥按什么顺序排列,容器都会比较相等。

以下是cppreference.com关于std:unordered_map,operator ==,!=(std :: unordered_map)的引文:

如果满足以下条件,则两个无序容器lhs和rhs的内容相等:

  • lhs.size()== rhs.size()
  • 从lhs.equal_range(lhs_eq1)获得的每组等效元素[lhs_eq1,lhs_eq2)在另一个容器[rhs_eq1,rhs_eq2)中具有从rhs.equal_range(rhs_eq1)获得的相应的等效元素组,该容器具有以下属性:
    • std :: distance(lhs_eq1,lhs_eq2)== std :: distance(rhs_eq1,rhs_eq2)。
    • std :: is_permutation(lhs_eq1,lhs_eq2,rhs_eq1)== true。

注意:

如果Key或T不等于EqualityComparable,则行为不确定。

如果Hash和KeyEqual确实(直到C ++ 20)KeyEqual确实(自C ++ 20起)在lhs和rhs上没有相同的行为,或者如果key的operator ==不能将分区细化为,则该行为也未定义KeyEqual引入的等效键组(即,如果两个使用operator ==比较相等的元素属于不同的分区)

最后,要考虑的是复杂性:

在平均情况下,与N的比例成比例地调用value_type上的operator ==,对由key_eq返回的谓词进行调用以及对由hash_function返回的哈希器进行调用。在最坏的情况下,N与容器的大小成正比。

因此,如果两个无序映射的大小都相同,并且在另一个容器中查找每个容器中的每个键,如果碰巧找到了它们,则将它们的值进行比较,然后将它们视为相同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM