-
Ordre dans un std::map
Bonjour à tous :)
Voila mon petit problème : j'insère des données dans un certain ordre dans un std::map mais au final il me les range dans l'ordre alphabétique.
Est-ce possible de supprimer cette contrainte et de garder l'ordre d'insertion établi ?
Naoss
-
Non, std::map est par essence un conteneur trié. Si tu as besoin de conserver l'ordre d'insertion utilise un autre conteneur, std::vector ou std::list par exemple.
-
Le problème c'est que mais élément sont indéxés par clé (Ogre::String) :s
-
J'espère ne pas dire de bêtise, mais si tu tiens à conserver l'ordre d'insertion originel, la recherche ne peut se faire qu'en un temps linéaire.
Est-ce ce que tu veux?
Il existe aussi des moyens de trier les éléments selon un critère que tu choisis, pas forcément l'ordre alphabétique.
-
Note pour info : Ogre::String est un typedef de std::string
Si en fait tu voulais juste garder l'ordre mais avoir l'identifiant quand même, tu as plusieurs solutions, comme par exemple utiliser un std::vector< std::pair< Ogre::String , Ogre::Machin* > > mais comme dit au dessus pour la recherche c'est pas top.
Personnellement dans ce genre de cas je tiens deux conteneurs de pointeurs: une std::map< Ogre::String , Ogre::Machin* > pour les recherches par identifiant, et a coté un std::vector< Ogre::Machin* > ou std::list< Ogre::Machin* > pour les manipulations qui dépendent d'un ordre spécifique.
De cette manière tu as le meilleur des deux, faut juste maintenir la cohérence de leur contenu (si on pointeur est dans l'un, il doit aussi être dans l'autre, sinon il ne doit pas ).
-
Si tu veux à la fois l'ordre et l'index, le mieux est de rajouter l'index de manière séparée, avec par exemple un vecteur pour stocker tes trucs et un index chaîne -> position pour les indexer.
Sinon, boost multi_index permet aussi de faire ça de manière très élégante, en te crééant automatiquement le conteneur qui va bien en fonction de tes critères...