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 :

Ordonner les éléments d'une map!


Sujet :

SL & STL C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 61
    Par défaut Ordonner les éléments d'une map!
    Bonjour, je veux trier les éléments d'une map qui ont la structure ChaineDeCaractèreCst_entier (voir debut_marqueurconcat.str() dans le code ci après).

    Je veux faire le trie en fonction de la valeur de l'entier ( curDm->first dans le code ci après).

    Exemple pour le jeu d'élément (2 6 5 8 3) les rangs seront ( 2-> 1er, 6 ->4 ième ........8-> 5ième).

    Mon code marche bien mais il fait le trier selon les valeurs croissantes de la chaine de caractère ( debut_marqueurconcat.str() ) elle même.

    Quelqu'un saurait il comment faire svp?

    Merci d'avance!


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    for(map<string, multimap<int, string> >::iterator curEspece = FamillesTrieesParEspece.begin(); curEspece!= FamillesTrieesParEspece.end(); ++curEspece)
                {
                    multimap<string, int> LocalDm2Rang; //Dm - Rang
                    string curEspeceName = curEspece -> first;
                    unsigned int rang=1; 
     
     
     
                        for(multimap<int, string>::iterator curDm = curEspece ->second.begin(); curDm != curEspece ->second.end(); ++curDm){
     
                                std::ostringstream  debut_marqueurconcat;
                                std::string espace = "_";
                                debut_marqueurconcat << curEspeceName << "_" << curDm->first ;
     
                        LocalDm2Rang.insert(pair< string, int> (debut_marqueurconcat.str(), rang));
                        curDmat.insert(pair< string, string> (debut_marqueurconcat.str(), curDm->second));
                        rang++;
     
     
                          /*fichierF << curEspece -> first;
                          fichierF <<" "<< curDm  -> first << " : " ;//Dm;
                          fichierF <<" "<< curDm  -> second << " : " ;//Famille ;
                          fichierF << rang  << endl;*/
     
     
                       }
                        Dm2rangParEspece.insert(pair <string, multimap<string, int> > (curEspeceName , LocalDm2Rang)); // Associe Espece <Dm , Rang>

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    Je ne suis pas sur de comprendre ta question.
    std::map et std::multimap acceptent un Compare comme 3ème argument pour faire la comparaison sur la clé. Il se substitue alors à '<' qui est utilisé par défaut. Je ne sais pas si cela répond à ta question

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 61
    Par défaut
    En effet ce que je veux faire c'est associer à chaque élément de ma map son rang comme dans l'exemple que j'ai donnée.

    Le rang correspond au compteur "rang" que j'ai implémenté (voir code).

    Pour l'instant ça marche sauf que mes élément de la map sont classé par ordre alphabétique croissant et non alpha numérique croissant.

    C'est parce que les éléments sont des strings. Mais qui ont une structure constante ( ChaineDeCaractèreCst_entier ), et je veux faire le classement selon la partie "entier" du string qui elle change.


    Revoici l' exemple avec la "ChaineDeCaractèreCst"
    pour le jeu d'élément (ChaineDeCaractèreCst_2 , ChaineDeCaractèreCst_6 , ChaineDeCaractèreCst_5 , ChaineDeCaractèreCst_8, ChaineDeCaractèreCst_3) les rangs seront ( ChaineDeCaractèreCst_2-> 1er, ChaineDeCaractèreCst_6 ->4 ième ........ChaineDeCaractèreCst_8-> 5ième).


    Je pense avoir été plus clair!
    Merci

  4. #4
    Membre chevronné
    Inscrit en
    Novembre 2006
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 362
    Par défaut
    La réponse à ton problème :
    Citation Envoyé par jamsgoodon Voir le message
    Pour l'instant ça marche sauf que mes élément de la map sont classé par ordre alphabétique croissant et non alpha numérique croissant.
    se trouve ici :
    Citation Envoyé par 3DArchi Voir le message
    std::map et std::multimap acceptent un Compare comme 3ème argument pour faire la comparaison sur la clé. Il se substitue alors à '<' qui est utilisé par défaut. Je ne sais pas si cela répond à ta question
    Tu pourras trouver des exemples ici. Elles concernent le set, mais le problème est exactement identique avec la map.

    Je te propose par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    bool compare(const std::string& a,const std::string& b)
    {
    	int a_int = String2IntFormatter::stringtoInt(a);
    	int b_int = String2IntFormatter::stringtoInt(b);
    	return a_int < b_int;
    }
    Il te faut ensuite coder String2IntFormatter de façon à ce qu'elle sache transformer tes chaines de caractères en entiers.
    Pour ce point, tu peux utiliser différentes méthodes :
    - boost::Spirit (compliqué à mettre en œuvre, mais tu sauras gérer tous les cas)
    - boost::Regex(à peine moins difficile à mettre en place, mais moins souple)
    - std::istringstream (plus accessible, mais tu vas forcément rater une exception au moins)

    Il n'y a pas de façon de faire qui soit à la fois bonne et facile à mettre en œuvre.

    En général, quand on peut, on évite de noyer ou de dénaturer l'information (c'est à dire de se retrouver dans le problème que tu as : des entiers stockés dans des strings).

    Notamment, parce que tu vas devoir répondre à tout un cas de questions comme :
    - qu'est-ce que je fais, si en entrée, je reçois "toto"
    - qu'est-ce que je fais, si en entrée, je reçois "42"
    - qu'est-ce que je fais, si en entrée, je reçois ""
    - qu'est-ce que je fais, si en entrée, je reçois "ChaineDeCaractèreCst_"
    - qu'est-ce que je fais, si en entrée, je reçois "ChaineDeCaractèreCst_42.4"
    - qu'est-ce que je fais, si en entrée, je reçois "ChaineDeCaractèreCst_42e5" (e pour exponentielle)
    - qu'est-ce que je fais, si en entrée, je reçois "ChaineDeCaractèreCst_+43"
    - qu'est-ce que je fais, si en entrée, je reçois "ChaineDeCaractèreCst_-43"

    Si la réponse à ces question est "ce n'est pas possible", alors ton code devrait faire en sorte que ce ne soit pas possible (et non-pas le supposer).

Discussions similaires

  1. Réponses: 9
    Dernier message: 17/09/2013, 11h59
  2. Récupérer les éléments de deux map différentes en une seule boucle.
    Par floctc dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 19/05/2010, 15h50
  3. Ordonner les éléments d'une table
    Par mmahouac dans le forum Servlets/JSP
    Réponses: 8
    Dernier message: 09/06/2009, 16h42
  4. [Thread] Synchroniser tous les éléments d'une map
    Par Monorom dans le forum Concurrence et multi-thread
    Réponses: 7
    Dernier message: 02/04/2007, 12h33
  5. Ordonner les éléments par rapport à une sélection ?
    Par brunoperel dans le forum Langage SQL
    Réponses: 3
    Dernier message: 22/03/2007, 12h13

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