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 et probleme d'erase.


Sujet :

SL & STL C++

  1. #1
    Membre éprouvé Avatar de Flow_75
    Femme Profil pro
    Ingénieure
    Inscrit en
    Mai 2005
    Messages
    1 100
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieure
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 100
    Par défaut std::map et probleme d'erase.
    bonjour,

    J'ai un bout de code a vous soumettre.

    J'ai une map (appelons la MAP) qui contient divers elements.

    je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if(MAP.find(element a effacer) != MAP.end()) // Verification de l'existence de l'element.
              MAP.erase(element a effacer);
    Le probleme est que au moment du test (apres débuggage), le contenu de la map est correcte dans le sens ou le contenu est coherent.
    Apres le erase, par contre, c'est le chaos dedans.
    Je comprend pas car, au passage suivant dans la fonction. La map MAP est redevenue coherent et sans l'element effacé....

    Merci de votre aide.

  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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Il faudrait voir plus de code, parce que là...

    Quant au test de présence de l'élément, il est inutile (erase ne va pas crasher s'il ne trouve pas l'élément ).

  3. #3
    Membre éprouvé Avatar de Flow_75
    Femme Profil pro
    Ingénieure
    Inscrit en
    Mai 2005
    Messages
    1 100
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieure
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 100
    Par défaut
    quel code supplémentaire veut tu voir ?
    Car je ne vois pas quoi rajouter qui pourrait aider...

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 266
    Par défaut
    Citation Envoyé par Laurent Gomila
    Quant au test de présence de l'élément, il est inutile (erase ne va pas crasher s'il ne trouve pas l'élément ).
    A ce propos, ça se passe de la même manière avec la méthode remove de la classe list ? ou il est nécessaire de tester auparavant si l'élément est bien dans la liste ?

  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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    erase ou remove, quelque soit le conteneur, ont un comportement parfaitement défini si l'élément n'a pas été trouvé (il faut bien rechercher l'élément avant de le supprimer).

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 266
    Par défaut
    Citation Envoyé par Laurent Gomila
    erase ou remove, quelque soit le conteneur, ont un comportement parfaitement défini si l'élément n'a pas été trouvé (il faut bien rechercher l'élément avant de le supprimer).
    Si je passe un élément en paramètre d'une fonction qui va supprimer cet élément d'une liste, j'ai le droit du faire direct un remove, ou je dois tester auparavant l'existence de cet élément dans la liste ?

  7. #7
    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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Citation Envoyé par frizou11
    Si je passe un élément en paramètre d'une fonction qui va supprimer cet élément d'une liste, j'ai le droit du faire direct un remove, ou je dois tester auparavant l'existence de cet élément dans la liste ?
    Mon message précédent n'était pas clair ?

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 266
    Par défaut
    Citation Envoyé par Laurent Gomila
    Mon message précédent n'était pas clair ?
    Ben si je te pose une nouvelle question après ton message c'est que je voulais une confirmation . S'il avait été assez clair je n'aurais pas posé ma question en expliquant la situation dans laquelle je comptais l'utiliser.
    Donc tu aurais pu répondre toi-même à ta question (Mon message précédent n'était pas clair ?) au vu de ma nouvelle question.
    Je ne dis pas par là que c'est pas clair comme réponse ce que tu as donnné, mais pour moi ça l'est pas assez (et seulement moi) ce qui entraine ma question juste après...

  9. #9
    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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Ben j'ai dit que le résultat serait toujours bien défini, quelque soit la fonction de suppression ou le type de conteneur, donc non tu n'as pas à t'assurer que l'élément est bien dans le conteneur avant de faire une suppression.

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 266
    Par défaut
    Merci.

  11. #11
    Membre éprouvé Avatar de Flow_75
    Femme Profil pro
    Ingénieure
    Inscrit en
    Mai 2005
    Messages
    1 100
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieure
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 100
    Par défaut
    ca résoud pas mon probleme....

  12. #12
    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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Citation Envoyé par Laurent Gomila
    Il faudrait voir plus de code, parce que là...

  13. #13
    Membre éprouvé Avatar de Flow_75
    Femme Profil pro
    Ingénieure
    Inscrit en
    Mai 2005
    Messages
    1 100
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieure
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 100
    Par défaut
    Citation Envoyé par Flob91
    quel code supplémentaire veut tu voir ?
    Car je ne vois pas quoi rajouter qui pourrait aider...

  14. #14
    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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Oups, j'avais pas vu

    Je sais pas, il faudrait voir un peu plus de contexte, parce que le code que tu donnes est correct tel quel. Si tu es motivé tu peux aussi tenter d'extraire un code minimal complet qui reproduit le problème.

  15. #15
    Membre éprouvé Avatar de Flow_75
    Femme Profil pro
    Ingénieure
    Inscrit en
    Mai 2005
    Messages
    1 100
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieure
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 100
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void DeleteArrow(std::string ArrowToDelete)
    {
     
      if(ArrowMap.find(ArrowToDelete) == ArrowMap.end())
          return;
      else
        ArrowMap.erase(ArrowMap.find(ArrowToDelete));
     
     
    ... suite de traitement ...
     
    // ArrowMap est une std::map<std::string,Arrow>

  16. #16
    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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Toujours pas de problème en vue. Tu ne peux pas utiliser un débogueur pour essayer de localiser un peu mieux l'erreur ?

  17. #17
    Membre éprouvé Avatar de Flow_75
    Femme Profil pro
    Ingénieure
    Inscrit en
    Mai 2005
    Messages
    1 100
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieure
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 100
    Par défaut
    à la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ArrowMap.erase(ArrowMap.find(ATD))
    ca me met bien le contenu de la map avec les differentes classses Arrow à l'interieur.
    a la ligne d'apres, pouf, tout est partie.
    quand je refais un nouveau passage dans la fonction, repouf c'est rapparue.

  18. #18
    Inactif  

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    534
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 534
    Par défaut
    Salut,

    Je ne comprends pas bien le problème. S'agit-il d'effacer une clé dans une std::map ?

    Dans ce cas par ex :
    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
     
    std::map<std::string, int> M ;
    M["zorro"] = 8 ;
    M["béba"] = 18 ;
    M["tara"] = 9 ;
    M["vanille"] = 12 ;
    M.insert( std::make_pair( "key 1", 10 ) );
     
    std::map< std::string,int>::iterator it;
    for( it = M.begin(); it != M.end(); it++ )
    std::cout << "Key= " << (*it).first << " Value= " << it->second << std::endl;
     
     
    it = M.find("key 1") ;
    if( it != M.end() )  M.erase( it ) ;
     
    for( it = M.begin(); it != M.end(); it++ )
    std::cout << "Key= " << it->first << " Value= " << it->second << std::endl;
    Mais c'est peut-être plus compliqué.

Discussions similaires

  1. std::map: erase dans une boucle
    Par zenux dans le forum Débuter
    Réponses: 6
    Dernier message: 03/10/2013, 21h48
  2. probleme avec std::map
    Par devdeb91 dans le forum Débuter
    Réponses: 2
    Dernier message: 21/02/2013, 23h52
  3. probleme avec un std::map
    Par Flow_75 dans le forum C++
    Réponses: 3
    Dernier message: 29/07/2008, 21h06
  4. Probleme avec std::map
    Par olive_le_malin dans le forum SL & STL
    Réponses: 14
    Dernier message: 27/02/2007, 09h58
  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