Est-ce juste un effet secondaire de l'implémentation (arbre rouge-noir) ou la commande est-elle garantie par la norme C++?Les éléments d'une carte std :: map sont-ils garantis?
Répondre
L'itération ordonnée n'est pas un détail d'implémentation; il est garanti par la norme C++. Il est une propriété fondamentale de tous les conteneurs associatifs (C++ 03 §23.1.2/9):
La propriété fondamentale des itérateurs de conteneurs associatifs est qu'ils itérer à travers les conteneurs dans l'ordre non décroissant de clés où non-descendant est défini par la comparaison qui a été utilisée pour les construire. Pour toutes deux itérateurs dereferenceable
i
etj
de telle sorte que la distancei
-j
est positif,value_comp(*j, *i) == false
value_comp
est le comparateur avec lequel la carte a été construit (par défaut, il est std::less<T>
).
+1. Bien sûr, cela n'est pas vrai pour les types non ordonnés. – rlbond
@rlbond: Vrai. Cependant, C++ 03 n'a pas de conteneurs associatifs non ordonnés et en C++ 0x ils sont catégorisés séparément (les "conteneurs associatifs" sont séparés des "conteneurs associatifs non ordonnés"). –
C'est garanti par la norme C++.
C'est génial si vous pouvez me diriger vers cette partie de la norme. – Thomson
Garanti. Si vous voulez quelque chose qui n'est pas contraint par cet essai boost: unordered_map <>
Ou, de même, 'std :: tr1 :: unordered_map <> '. – Frank
§23.1.2/2:
Chaque conteneur associatif est paramétré sur
Key
et une commande relationCompare
qui induit une relation d'ordre strict faible (25.3) sur les éléments deKey
. ... L'objet du typeCompare
est appelé l'objet de comparaison d'un conteneur . Cet objet de comparaison peut être un pointeur vers une fonction ou un objet d'un type avec un opérateur d'appel de fonction approprié.
L'objet Compare
par défaut est la fonction inférieure à std::less<Key>
.
La commande est une propriété de la fonction. C'est une exigence, pas un effet secondaire.
Le tri est un effet secondaire. 23.1.2/10 et 23.1.2/9 (cité par James) garantissent que map/set et multimap/multiset ont des clés croissantes/non décroissantes, respectivement, sur la séquence de begin
à end
.
La classe est std :: map, pas stl :: map. –
Non, l'implémentation (arbre rouge-noir, mais pas nécessairement) est choisie pour répondre à l'exigence de la commande. – UncleBens