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 :

Problèmes avec map et chaînes en tant que clé


Sujet :

SL & STL C++

  1. #1
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut Problèmes avec map et chaînes en tant que clé
    Bonjour,

    J'ai créé un map avec comme clé un const char*.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    std::map<const char*, int> pouet;
    
    map["foo1"] = 1;
    map["foo2"] = 2;
    
    const char* cle1 = "foo1";
    std::string   cle2 = "foo2";
    
    std::map<const char*, int>::const_iterator
       iterator1(pouet.find(cle)),
       iterator2(pouet.end());
    
    if (mit != end)
       cout << "Clé trouvée." << endl;
    Si, dans l'argument du find, je mets cle1, l'élément est trouvé.
    Si je mets cle2.c_str(), l'élément n'est pas trouvé.

    Pourquoi ? Parce qu'on compare dans le map des pointeurs ?

    Merci.

  2. #2
    Membre à l'essai
    Inscrit en
    Septembre 2008
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 21
    Points : 24
    Points
    24
    Par défaut
    Effectivement, ton analyse est correcte, le map compare les adresse des chaines plutot que le contenu.

    Tu peux utiliser map<string, int> à la place.

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    OK, je prend acte.

    Même si je ne comprend pas en quoi ça gêne le compilateur de comparer des adresses de pointeur. :-)

  4. #4
    Membre averti

    Inscrit en
    Juillet 2008
    Messages
    186
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 186
    Points : 350
    Points
    350
    Par défaut
    Ça ne le gène pas du tout. Il compare les pointeurs et ... ils sont différents.

    En effet, cle2.c_str() renvoie un pointeur sur la chaîne qui est stockée à l'intérieur de l'objet std::string. Il est différent du pointeur sur la chaîne littérale "foo2" utilisée pour peupler le map.

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Ah oui, effectivement.
    Suis-je bête...

    Merci !

    Je clos le sujet.

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

Discussions similaires

  1. problème avec une fonction utilisé en tant que formule
    Par alex288 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 07/01/2012, 16h04
  2. [STL]Problème avec map
    Par mambo dans le forum SL & STL
    Réponses: 11
    Dernier message: 27/07/2006, 15h39
  3. [Tableaux] Problème avec remplacement dans chaîne
    Par Baptiste Wicht dans le forum Langage
    Réponses: 5
    Dernier message: 13/07/2006, 10h04
  4. Problème avec traitement de chaînes
    Par cortex007 dans le forum Langage
    Réponses: 6
    Dernier message: 25/04/2006, 16h22
  5. [PERL] Problème avec map
    Par LE NEINDRE dans le forum Langage
    Réponses: 9
    Dernier message: 05/10/2005, 09h48

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