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 :

probleme de multimap


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 57
    Par défaut probleme de multimap
    hello,

    je souhaites retirer d'une multimap <int value, int ID> une instance.comment puis-je faire autrement que parcourir la multimap pour trouver la bonne valeure,
    parcourir toutes ces instances pour trouver le bon ID ?

    pas simple les multimap

    merci

  2. #2
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Utilise std::find

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 57
    Par défaut
    en effet find () permet d'avoir un iterateur sur une clef mais dans la multimap il y a plusieurs valeures pour une meme clef.

    du coup comment faire pour faire un find (value, key) ?

  4. #4
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 287
    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 287
    Par défaut
    Quand une fonction membre est disponible dans les conteneurs de la STL, la préférer aux fonctions libres homonymes.
    Et si tu veux rechercher la plage de valeur qui correspond, tu dois avoir equal_range je pense.
    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...

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 109
    Par défaut
    Bonjour,


    Petite précision sur les equal_range (si tu as le livre de BS / le langage C++ c'est page 541 pour en savoir +).
    Si l'élément cherché avec equal_range n'existe pas, l'opération renvoie la paire de clefs d'indice supérieure et non end().
    Si la clef d'indice supérieure n'existe pas alors end() est renvoyé.

    Donc si tu n'es pas sûr de ton coup (en gros que la clef existe) il faut d'abord tester avec find.

    Bon courage.

  6. #6
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 287
    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 287
    Par défaut
    equal_range te renvoie un range ... une plage en français
    - si sa taille est nulle (éléments égaux) => rien n'a été trouvé. Plus on a une indication de positionnement
    - sinon, on a une plage [first,last[ d'éléments trouvés.

    Le find est parfaitement inutile si on veut tous les éléments qui correspondent au critère de recherche.
    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...

  7. #7
    Membre émérite
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    943
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 943
    Par défaut
    Je ne sais pas si tu as résolu ton problème mais c'est vrai que les multimap ne semblent pas tres simple aux premiers abords.

    Une methode comme une autre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    typedef multimap < int, Int, mapIntCmp>::iterator   Iter
    pair <Iter, Iter> p = map_concerne.equal_range (value) ;
    for (Iter pos = p.first ; pos != p.second ; ++pos)
    {
        if (pos->second == ID_recherche)
       {
            //      blablablabla
            break ;
        }
    }
    ca devrait donner un truc dans le genre

  8. #8
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 287
    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 287
    Par défaut
    Oups. Je viens de percuter avec un temps de retard pas possible que la recherche était sur l'élément indexé (et non sur l'index).

    Donc effectivement, tu peux faire une recherche linéaire comme proposé par ash.ice.loky.

    Suivant les fréquences des recherches "inversées" (relativement aux insertions et autres parcours), il peut être intéressant de maintenir une autre table triée sur le second champs. Cela revient un peu à réinventer boost.multi_index.
    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...

Discussions similaires

  1. Réponses: 6
    Dernier message: 02/05/2007, 13h15
  2. Probleme de rafraichissement d'un BDGrid
    Par marmotte dans le forum Bases de données
    Réponses: 10
    Dernier message: 28/05/2004, 18h07
  3. Probleme sur les chaines de caractere
    Par scorpiwolf dans le forum C
    Réponses: 8
    Dernier message: 06/05/2002, 19h01
  4. [Kylix] Probleme d'execution de programmes...
    Par yopziggy dans le forum EDI
    Réponses: 19
    Dernier message: 03/05/2002, 14h50
  5. [Kylix] Probleme de nombre flottant!!
    Par yopziggy dans le forum EDI
    Réponses: 5
    Dernier message: 02/05/2002, 10h13

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