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

C++ Discussion :

Inserer des elements dans une map sans rangement ?


Sujet :

C++

  1. #1
    Membre régulier
    Inscrit en
    Septembre 2002
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 200
    Points : 120
    Points
    120
    Par défaut Inserer des elements dans une map sans rangement ?
    Bonjour a tous, j'essaye d'utiliser le conteneur map de la STL mais je bute sur un point important :
    Lors de la creation de cette map on peut définir un ordre d'insertion des nouvelles clefs, par defaut c'est "less".

    Si je desire ranger cette map dans l'ordre inverse, je peux la declarer telle que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::map<AnsiString, AnsiString, std::greater<AnsiString>() >
    Voila, ceci est une map contenant des paires de chaines de caractères rangés dans lordre alphabétique inverse. J'utilise des AnsiString parceque je suis sous C++Builder et j'aime bien les AnsiString !! :p

    Mais j'ai deux contraintes :
    - Je veux garder ce type de conteneur (map) car l'on dispose de clefs associées a des valeurs.
    - J'acquiers des elements d'une base de données et je dois garder leur ordre d'insertion. DONC IL NE DOIT PAS Y AVOIR DE RANGEMENT SELON UN CERTAIN ORDRE mais un rangement "au fur et a mesure" dans la map, comme ca se passe dans un vecteur lorsque l'on fait un push_back(...).

    Alors comment faire pour inserer des elements dans une map sans quils soient rangé selon le comparateur (less, greater, equal, etc....), y a t il un comparateur special ou dois-je en recreer un ?
    Sinon y a t il un autre conteneur que map qui ne soit pas indexé mais qui garde les memes propriétés et la meme structure (clef, valeur) ?


    Merci pour votre aide.

  2. #2
    Membre averti
    Avatar de David Fleury
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 253
    Points : 307
    Points
    307
    Par défaut
    Salut, le but d'un map est de retrouver une valeur à partir d'un clef.
    La manière de trier le map est plutôt anecdotique à mon sens.
    Pourquoi n'utilises-tu pas simplement un std::vector pour stocker tes éléments ou une std::list. Pour l'accès, un std::binary_search permet ensuite d'accéder rapidement à tes éléments ( ainsi que les autres algo sur les conteneurs triés). Plus tard, pour avoir un accès rapide sur tes éléments de ton std::vector, tu peux toujours créer un std::map d'index sur ton std::vector. ( à l'image des différents index d'une base de données).
    Je ne connais pas les AnsiString mais je serai étonné qu'elles valent autant le coup pour avoir à renoncer à la portabilité.

    Remarque que tout ça dépend beaucoup de ce que tu fais ensuite de ton conteneur et ses éléments.

    PS: Au pire, il doit y avoir les reverse_iterator sur le map.

  3. #3
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    std::map est un arbre, et nécessite pour son implémentation de disposer d'un ordre sur les élements. Cela permet de retrouver une clé rapidement (O(ln N)).

    Sinon, à l'image des multi index de boost, tu peux stocker tes données selon l'ordre qu'il te plait, et définir une structure comme une map qui va associer un index d'entrée dans ton ensemble d'éléments à une clé. Ou le contraire. Peu importe.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  4. #4
    Membre régulier
    Inscrit en
    Septembre 2002
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 200
    Points : 120
    Points
    120
    Par défaut
    Merci pour votre aide. J'ai donc finallement opté pour un vecteur qui contient une structure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    struct associate{
            AnsiString tirage;
            AnsiString solution;
            associate(AnsiString t, AnsiString s) : tirage(t), solution(s) {};
    };
    et donc mon vecteur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    std::vector<associate> v ;
    Sinon en effet j'utilise des AnsiString et ce n'est pas portable mais je les trouve bien les AnsiString et c'est un programme 100% personnel sous C++ Builder, nul doute que sinon j'utilise des std::string . Mais AnsiString offre pas mal de fonction sympas en plus...

    Merci encore. A plus tard.
    Alexandre

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. je ne peut pas inserer des elements dans une table
    Par lamis2009 dans le forum Forms
    Réponses: 8
    Dernier message: 22/02/2009, 21h03
  2. Inserer des valeurs dans une cellule
    Par azerty53 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 29/09/2006, 16h27
  3. inserer des photos dans une bdd mysql
    Par oceane751 dans le forum Requêtes
    Réponses: 3
    Dernier message: 20/05/2006, 20h06
  4. Inserer des données dans une table access SQL
    Par ouellet5 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 23/11/2005, 21h11
  5. inserer des images dans une base de données
    Par alilou04 dans le forum Bases de données
    Réponses: 2
    Dernier message: 28/06/2004, 18h54

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