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 :

Problème map et itérateur


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Inscrit en
    Février 2006
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 42
    Points : 28
    Points
    28
    Par défaut Problème map et itérateur
    Bonjour,
    J'ai défini une map d'objets complexes (des classes).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    struct cmp
    {
      bool operator()(const UInt128* val1, const UInt128* val2) const{
        return val1->compareTo(*val2);
      }
    };
     
    map<const UInt128*, const Contact*, cmp> contacts;
    Les opérateurs ==, != <, >, <=, >= sont définis dans les classes UInt128 et Contact.

    Le problème c'est que si je met 20 éléments dans ma map, lorsque je la parcours avec un itérateur de cette manière,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    map<const UInt128*, const Contact*, cmp>::const_iterator it;
    for (it = contacts_.begin(); it != contacts_.end(); it++){
          cout << "test" << endl;
    }
    je n'ai que deux fois l'affichage "test". Autrement dit,
    la map n'est pas enitèrement parcourue alors qu'en affichant contacts.size() avant et après la boucle, j'ai bien 20 d'affiché...

    Par contre, j'ai bien 20 fois "test" si j'enlève le comparateur cmp dans la définition de la map, c'est à dire si je fais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    map<const UInt128*, const Contact*> contacts;
    J'ai besoin du comparateur cmp. D'ou peut venir le problème et comment le résoudre?

    Merci !

  2. #2
    Nouveau membre du Club
    Inscrit en
    Février 2006
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 42
    Points : 28
    Points
    28
    Par défaut
    Merci!

    En fait j'ai dû mettre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struct cmp
    {
      bool operator()(const UInt128* val1, const UInt128* val2) const{
        return val1->compareTo(*val2) == -1;
      }
    };

    au lieu de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struct cmp
    {
      bool operator()(const UInt128* val1, const UInt128* val2) const{
        return val1->compareTo(*val2);
      }
    };
    (compareTo renvoie -1, 0 ou 1 selon que l'objet est considéré comme étant plus petit, égal ou plus grand.


    Edit : bizarre, un forumeur m'avait donné une réponse mais elle n'y est plus.

  3. #3
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    oui il y'avait quelque chose qui ne me plaisait pas dans ma réponse et j'étais en train de la réécrire.

    plutot que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    struct cmp
    {
      bool operator()(const UInt128* val1, const UInt128* val2) const{
        return val1->compareTo(*val2) == -1;
      }
    };
    je mettrais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    struct cmp
    {
      bool operator()(const UInt128* val1, const UInt128* val2) const{
        return (val1->compareTo(*val2) < 0);
      }
    };
    surtout si le compareTo que tu utilise est celui-ci
    http://msdn.microsoft.com/en-us/libr...to(VS.71).aspx

    Ils ne spécifient pas les valeur de retour.
    Citation Envoyé par msdn
    Return Value

    A 32-bit signed integer that indicates the relative order of the comparands. The return value has these meanings:
    Value Meaning
    • Less than zero This instance is less than obj.
    • Zero This instance is equal to obj.
    • Greater than zero This instance is greater than obj.
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  4. #4
    Nouveau membre du Club
    Inscrit en
    Février 2006
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 42
    Points : 28
    Points
    28
    Par défaut
    D'accord, merci!

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

Discussions similaires

  1. [EJB & WS] Problème Mapping Types complexes
    Par Mehdibr dans le forum Services Web
    Réponses: 3
    Dernier message: 04/07/2007, 14h40
  2. Problème avec <list> itérateur
    Par yanchasp dans le forum C++
    Réponses: 11
    Dernier message: 06/06/2007, 19h07
  3. Problème mapping String.Array côté client
    Par valjjou dans le forum Services Web
    Réponses: 1
    Dernier message: 04/04/2007, 13h10
  4. [hibernate]Problème mapping classe association
    Par jsl1 dans le forum Hibernate
    Réponses: 6
    Dernier message: 16/06/2006, 17h27
  5. [Hibernate & Eclipse] problème mapping
    Par sonia_ppr dans le forum Hibernate
    Réponses: 4
    Dernier message: 04/05/2006, 14h32

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