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

Visual C++ Discussion :

Probleme avec "find" pour une map


Sujet :

Visual C++

  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2006
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 38
    Points : 22
    Points
    22
    Par défaut Probleme avec "find" pour une map
    Salut,

    J'aimerais avoir votre avis sur le probleme suivant, parce que je n'y comprends rien :


    -> J'ai une std::map dont les cles sont des abscisses (type double) et les valeurs des hauteurs (type double).

    ->J'ai une fonction qui me donne, pour une abscisse donnee quelconque, l'abscisse du point de la map le plus proche. Elle fait cela avec une boucle et des iterateurs, donc je suis a priori certain que l'abscisse renvoyee est bien dans la map.

    -> Or si je veux supprimer une entree, je demande a l'utilisateur de rentrer une abscisse, la fonction ci-dessus renvoie l'abscisse la plus proche existante dans la map, et je fais un find pour recuperer un iterateur puis un erase avec l'iterateur en qestion
    Et la, l'erase plante, parce que le find a pas trouve l'abscise dans la map...


    D'ou cela peut-il venir ?

    Je n'ai pas tout detaille, mais il y a d'autres trucs vraiment bizarres, parce qu'il arrive par exemple que je copie ma map (map1) temporairement dans une autre (map2), et map2.count(abscisse) vaut 1 alors que map1.find(abscisse) ne renvoie rien...

    Help !
    Merci

    Charles

  2. #2
    Membre éprouvé
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Points : 1 067
    Points
    1 067
    Par défaut
    Je dis peut être une bêtise tellement ça me paraît gros, mais il me semble qu'il ne faut jamais utiliser de = avec les type double, justement à cause de la virgule. En général il faut déterminer un epsilon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    double epsilon = 0.000001;    // Définit la tolérance de l'égalité
    if( (initial_value - my_value) < epsilon)
         // On considère que les valeurs sont égales
    else
         // on considère que les valeurs ne sont pas égales
    Je ne sais pas comment fonctionne la fonction map.find de la STL, mais je suppose qu'ils ont prévu le coup (ou peut-être pas?). Je dirais donc que c'est un problème de virgule.
    Ma solution : travaille en dixième, centième ou millième d'abscisse de façon à n'utiliser que des valeurs entières. Tu n'auras normalement alors plus de problème.

  3. #3
    Membre à l'essai
    Inscrit en
    Juillet 2006
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 38
    Points : 22
    Points
    22
    Par défaut
    Wahou, alors la je suis scie ! Si c'est ca on me l'a toujours bien cache !!!

    Bon je tente (ca se pourrait effectivement bien que le probleme vienne de ce que tu dis parce que ca correspond parfaitement), et je reviens plus tard pour donner des nouvelles
    Merci beaucoup !

    ++

    Charles

  4. #4
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    mettre un double dans une clef de map je ne suis pas convaincu que la map sache gérer ça correctement...
    tu peux aussi convertir ta clef en chaine de caractères ou tu pourras contrôler ta précision ...

  5. #5
    Membre à l'essai
    Inscrit en
    Juillet 2006
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 38
    Points : 22
    Points
    22
    Par défaut
    Me revoila !

    Alors je confirme ce aue vous avez dit : les maps ne gerent pas automatiquement les doubles dans leur cles.
    Il faut donc ruser et passer par les iterateurs (enfin c'est ce que j'ai fait) avec une fonction de ce genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    typemap::iterator GetIterator(double x, typemap map)
    {
        typemap::iterator it;
        const double EPSILON 0.0000001; //precision souhaitee
        it = map.begin();
     
        while (it!=map.end() && fabs(it->first-x) > EPSILON)
            it++;
     
        return it;
    }
    Merci
    ++

    Charles

  6. #6
    Membre éprouvé
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Points : 1 067
    Points
    1 067
    Par défaut
    Attention,
    • it n'est pas déclaré
    • ce que tu as fait te permettra juste de tomber sur une clé "égale" à ton double d'entrée. Ta fonction ne devrait alors pas s'appeler FindClosest car ce n'est pas ce qu'elle fait (à moins que ta map contienne toutes les coordonnées au pas de ton epsilon). C'est plus un truc du genre FindAbscisse ou FindCoordonnee

  7. #7
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    je trouve que l'intérêt de la map en prend un coup du moins dans cette forme....
    la technique du hashcoding permettait de retrouver un élément rapidement dans une map, la il faut tout balayer pour trouver l'information...

  8. #8
    Membre éprouvé
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Points : 1 067
    Points
    1 067
    Par défaut
    Citation Envoyé par farscape Voir le message
    je trouve que l'intérêt de la map en prend un coup du moins dans cette forme....
    la technique du hashcoding permettait de retrouver un élément rapidement dans une map, la il faut tout balayer pour trouver l'information...
    +1
    Encore une fois, je te conseille de travailler avec des entiers (dixièmes, centièmes, millièmes, .... d'abscisse).

  9. #9
    Membre à l'essai
    Inscrit en
    Juillet 2006
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 38
    Points : 22
    Points
    22
    Par défaut
    ...

    Donc j'ai corrige ce que tu disais spoutspout dans mon code. Et en fait j'avais lu un peu trop vite ta reponse et donc zappe la solution que tu proposais ( re-).
    Dommage parce que c'etait le pied et j'avais pas besoin de tout modifier comme je viens de le faire !

    Et oui effectivement l'interet de la map devient tres tres faible... Si je trouve le temps je remodifierai dans l'autre sens

    Merci encore

    Charles

Discussions similaires

  1. Réponses: 8
    Dernier message: 27/08/2008, 18h36
  2. Réponses: 0
    Dernier message: 10/08/2007, 21h42

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