Voici des citations de cppreference.com à propos du std:unordered_map, opérateur==,!=(std::unordered_map) :
Les contenus de deux conteneurs non ordonnés lhs et rhs sont égaux si les conditions suivantes sont remplies :
- lhs.size() == rhs.size()
- chaque groupe d'éléments équivalents [lhs_eq1, lhs_eq2) obtenu à partir de lhs.equal_range(lhs_eq1) a un groupe correspondant d'éléments équivalents dans l'autre conteneur [rhs_eq1, rhs_eq2) obtenu à partir de rhs.equal_range(rhs_eq1), qui a les propriétés suivantes :
- std::distance(lhs_eq1, lhs_eq2) == std::distance(rhs_eq1, rhs_eq2).
- std::is_permutation(lhs_eq1, lhs_eq2, rhs_eq1) == true.
Notez que :
Le comportement est indéfini si Key ou T ne sont pas EqualityComparable.
Le comportement est également indéfini si Hash et KeyEqual n'ont pas (jusqu'à C++20)KeyEqual n'a pas (depuis C++20) le même comportement sur les lhs et rhs ou si operator== pour Key n'est pas un raffinement de la partition en groupes de clés équivalentes introduite par KeyEqual (c'est-à-dire, si deux éléments qui se comparent de manière égale en utilisant operator== tombent dans des partitions différentes).
Enfin, il faut tenir compte de la complexité :
Proportionnel à N appels à l'opérateur== sur value_type, appels au prédicat renvoyé par key_eq et appels au hachoir renvoyé par hash_function, dans le cas moyen, proportionnel à N2 dans le cas le plus défavorable où N est la taille du conteneur.
Par conséquent, si les deux cartes non ordonnées ont la même taille, et que chaque clé de l'un des conteneurs est recherchée dans l'autre, et que si elle est trouvée, leurs valeurs sont comparées, alors elles sont considérées comme identiques.
0 votes
L'avez-vous essayé ? En outre, cette garantie découlerait de la norme ISO correspondante, qui contient donc indirectement la réponse.
0 votes
@UlrichEckhardt J'ai essayé, et la réponse semble être "oui, cela dépend de l'ordre d'insertion", mais je ne suis pas sûr que ce soit parce que j'ai fait une erreur.
0 votes
Non. (Cet espace est intentionnellement laissé blanc)
0 votes
Echantillon code montrant l'égalité de toutes les permutations des séquences d'insertion pour une carte de 4 paires<char, string>
3 votes
@UlrichEckhardt "Have you tried it" ne peut pas vous dire si "it doesn't depend on insertion order" est une caractéristique de cette implémentation, ou est garanti pour toutes les implémentations C++. (Je suppose que c'est peut vous dire que "cela dépend de l'ordre d'insertion" - mais toutes les réponses ci-dessous montrent que ce serait un bug dans l'implémentation).
0 votes
Notez que
operator==
ne tient pas compte des attributs non saillants du conteneur. Ainsi, le fait qu'ils se comparent de manière égale ne garantit pas qu'ils se comporteront de manière identique dans tous les contextes possibles. Par exemple, le coût d'exécution exact de la recherche d'un élément spécifique peut encore être différent dans les deux conteneurs.