IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SL & STL C++ Discussion :

Ordre dans un std::map


Sujet :

SL & STL C++

  1. #1
    Membre éclairé Avatar de Kromagg
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2008
    Messages : 275
    Par défaut 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

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Par défaut
    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.

  3. #3
    Membre éclairé Avatar de Kromagg
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2008
    Messages : 275
    Par défaut
    Le problème c'est que mais élément sont indéxés par clé (Ogre::String) :s

  4. #4
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    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.

  5. #5
    Membre Expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Par défaut
    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 ).

  6. #6
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    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...

Discussions similaires

  1. Réponses: 1
    Dernier message: 02/10/2012, 14h38
  2. Acceder a la fonction membre d'une classe, dans une std::map
    Par student_php dans le forum Débuter
    Réponses: 2
    Dernier message: 10/05/2011, 20h38
  3. Ajout d'un élément dans un std::map
    Par Razor620 dans le forum SL & STL
    Réponses: 7
    Dernier message: 29/12/2008, 13h04
  4. Conserver l'ordre dans un Map
    Par rach375 dans le forum Collection et Stream
    Réponses: 7
    Dernier message: 26/09/2006, 16h22
  5. Libérer des pointeurs dans une std::map
    Par GaldorSP dans le forum SL & STL
    Réponses: 2
    Dernier message: 09/07/2005, 14h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo