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 :

[std::map] methode find


Sujet :

SL & STL C++

  1. #1
    Membre éclairé Avatar de ZaaN
    Inscrit en
    Novembre 2005
    Messages
    819
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 819
    Points : 661
    Points
    661
    Par défaut [std::map] methode find
    hello à tous,

    J ai une map, trié sur le premier element (first).
    La fonction std::map::find permet de retrouvé une entrée en specifiant la recherche par rapport à la clé (first).
    Si elle echoue, elle renvoie un iterateur sur la fin de la map. Bon, rien de nouveau jusqu ici !

    Mon but : faire qu' en cas d'echec, la fonction retourne l'entrée precedente (l'element avec le first inferieur qui precede)

    Que me conseillez vous ? (je sais pas si on peut faire faire ca à une fonction std ou si je dois rappeler moi meme la fonction find) et en plus je ne connait pas la clé precedente et je risque de faire des grande boucle
    Pour les details, cherche tout seul !

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Tu peux bidouiller à partir de lower_bound, qui renvoie un itérateur sur le plus petit élément qui n'est pas inférieur à la clé passée en paramètre.
    Tu peux aussi le faire à la main avec une boucle.

  3. #3
    Membre habitué
    Avatar de superspag
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 153
    Points : 186
    Points
    186
    Par défaut
    Un truc comme ça par exemple ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    std::map<...,...> myMap;
    ...
    std::map<...,...>::const_iterator it = myMap.find(...);
    if( it == myMap.end() )
      it--;
    Plus y'a d'Gruyère, plus y'a d'trous !
    Plus y'a d'trous, moins y'a d'Gruyère...
    Donc, Plus y'a d'Gruyère, moins y'a d'Gruyère !!!

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 433
    Points : 240
    Points
    240
    Par défaut
    Je confirme, le code de SuperSpag devrait marcher.
    Ou alors de la manière suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    std::map<...,...> myMap;
    ...
    std::map<...,...>::reverse_iterator it = myMap.find(...);
    if( it == myMap.begin() )
      it++;
    En espérant que je ne me soit pas mélangé les pinceaux en inversant, erf !

  5. #5
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Cette solution va renvoyer le dernier élément, or il veut l'élément inférieur le plus proche de celui recherché (si j'ai bien compris).

  6. #6
    Membre habitué
    Avatar de superspag
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 153
    Points : 186
    Points
    186
    Par défaut
    Citation Envoyé par Laurent Gomila
    Cette solution va renvoyer le dernier élément, or il veut l'élément inférieur le plus proche de celui recherché (si j'ai bien compris).
    A oui, tu as sans doute raison, j'ai du mal comprendre l'ennoncé...

    Dans ce cas, il suffit de remplacer "find" par "lower_bound" en effet...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    std::map<...,...> myMap;
    ...
    std::map<...,...>::const_iterator it = myMap.lower_bound(...);
    if( it == myMap.end() || it->first != ... )
      it--;
    ça devrait fonctionner. il faudra aussi penser à gérer les cas extrèmes
    Plus y'a d'Gruyère, plus y'a d'trous !
    Plus y'a d'trous, moins y'a d'Gruyère...
    Donc, Plus y'a d'Gruyère, moins y'a d'Gruyère !!!

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

Discussions similaires

  1. SIGSEGV sur une std::map::find();
    Par DakM dans le forum Langage
    Réponses: 4
    Dernier message: 31/03/2012, 10h29
  2. Réponses: 7
    Dernier message: 17/01/2009, 13h10
  3. std::map::find
    Par Blowih dans le forum SL & STL
    Réponses: 12
    Dernier message: 21/12/2005, 19h42
  4. STL: les map et la methode find. que fait-elle?
    Par cokmes dans le forum SL & STL
    Réponses: 6
    Dernier message: 07/11/2005, 08h31
  5. Trier un std::map selon les valeurs plutot que les clés
    Par dj.motte dans le forum SL & STL
    Réponses: 2
    Dernier message: 13/11/2004, 21h54

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