Je pense que la conclusion de @Sharth est correcte, mais (pour quiconque se soucie de normes plus récentes) est déjà obsolète (et peut ne jamais avoir reflété la réalité - voir ci-dessous).
Des versions plus récentes de la norme (par exemple, n3797) ont modifié les exigences, apparemment de manière intentionnelle. enlever l'obligation de passer commande. Plus précisément, il est dit (§23.2.5/12) :
Deux conteneurs non ordonnés a
y b
comparez, égalisez si a.size() == b.size()
et, pour tout groupe à clé équivalente [ Ea1
, Ea2
) obtenu à partir de a.equal_range(Ea1)
il existe un groupe de clés équivalentes [ Eb1
, Eb2
) obtenu à partir de b.equal_range(Ea1)
de telle sorte que distance(Ea1, Ea2) == distance(Eb1, Eb2)
y is_permutation(Ea1, Ea2, Eb1)
retourne vrai.
J'ai également une confiance relativement faible dans le fait que les implémentations répondent réellement aux exigences de la norme 2011. En particulier, les conteneurs non ordonnés sont normalement implémentés comme des tables de hachage avec des listes liées pour la résolution des collisions. Comme ces listes liées sont censées être courtes, elles ne sont pas nécessairement triées (d'autant plus que les éléments stockés dans des conteneurs non ordonnés ne sont pas tenus de définir les opérations à utiliser pour le tri, telles que operator<
). Dans ce cas, il est assez courant que les listes liées contiennent les mêmes éléments, mais dans un ordre qui dépend de l'ordre dans lequel ils ont été insérés.
Dans ce cas, il serait assez courant que deux tables de hachage contenant les mêmes éléments qui ont été insérés dans des ordres différents, itèrent sur ces éléments dans des ordres différents.
En théorie, une telle mise en œuvre n'est pas conforme à la norme C++11 - mais je suppose que le changement cité ci-dessus a été effectué en grande partie parce que cette exigence ne pouvait pas être satisfaite en pratique (parce que, comme indiqué ci-dessus, le conteneur n'avait aucun moyen de faire respecter l'ordre).
Donc, tant que vous traitez avec le même conteneur, inchangé, dépendre de l'itération dans le même ordre peut être sûr. Cependant, deux conteneurs ayant le même contenu peuvent ne pas fonctionner aussi bien (et même dans ce qui prétend être une implémentation C++11, vous ne pouvez probablement pas vous attendre à ce qu'elle réponde à des exigences plus strictes que celles contenues dans les nouvelles versions).