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

时间:2018-08-06 15:22:45

标签: c++ unordered-map

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

3 个答案:

答案 0 :(得分:30)

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

  

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

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

答案 1 :(得分:13)

来自[unord.red]/12

  

如果a,则两个无序容器ba.size() == b.size()相等,并且对于从[Ea1, Ea2)获得的每个等效键组a.equal_­range(Ea1),存在一个等效项从[Eb1, Eb2)获得的密钥组b.equal_­range(Ea1),使得is_­permutation(Ea1, Ea2, Eb1, Eb2)返回true。 [...]

因此,只要键相同且大小相同,无论键的顺序如何,容器将进行比较。

答案 2 :(得分:3)

以下是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.equal_range(rhs_eq1)获得的另一个容器[rhs_eq1,rhs_eq2)中具有相应的等效元素组。特性:      
        
    • 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返回的哈希器,在通常情况下,与最坏情况下的N2成正比,其中N是容器。

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