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 :

Chercher attribut d'une Clé dans une map


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 18
    Par défaut Chercher attribut d'une Clé dans une map
    Bonjour,

    Alors je vous explique en quelques mots mon problème, voilà ce que j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    map<A*, map<A*, B*>& MyMap;
    Oui, c'est un peu tordu... J'aimerais maintenant savoir si une clé existe dans cette map mais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MyMap.find(MonObjetA*);
    ne me convient pas parce que - et là je ne suis pas sûre de ce que j'avance - il va chercher une clé qui a la même adresse que MonObjetA* et ne pas en trouver.

    J'aimerais simplement comparer les attributs de l'objet A, par exemple trouver une clé qui a le même nom que MonObjetA, ou plus exactement puisque je trimballe des pointeurs: trouver une clé qui pointe vers un objet A qui a le même nom que MonObjetA.

    Est-ce possible? A l'aide d'un itérateur par exemple? Il y a plus astucieux?

    Merci d'avance!

  2. #2
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    Bonjour,
    Oui c'est possible, il faut fournir le prédicat de comparaison lors de la déclaration de la map :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::map<key, value, Compare> my_map
    Compare doit être une fonction ou un foncteur et doit avoir pour signature :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bool Compare(key a, key b)
    Si tu ne fournis pas de prédicat, alors c'est l'opérateur < qui est utilisé par défaut - donc dans ton cas, la map est pour le moment ordonnée selon les adresses des objets A.

  3. #3
    Membre éprouvé
    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    189
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 189
    Par défaut
    Ce ne serait pas plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bool Compare(key const & a, key const & b)

  4. #4
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 18
    Par défaut
    Hum... Et quand je fournis le Compare qui convient, je peux faire un find qui cherche uniquement si une clé de la map a le même attribut de mon objet passé en paramètre de find?

  5. #5
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    La clé ne devrait normalement strictement rien avoir à faire avec l'objet servant de valeur...

    Si tu veux qu'un attribut (ou qu'une propriété) particulier(e) de ta classe serve de clé, il est largement préférable de choisir... le type de cet(te) attribut (ou de cette propriété) comme type de clé...

    Autrement, il est largement préférable d'utiliser le std::set pour lequel l'objet contenu sert lui-même de clé

    Le set a cependant l'inconvéniant qu'il n'y a moyen de récupérer l'objet que sous une forme constante (tu ne pourra accéder qu'aux fonctions déclarées constantes de l'objet récupéré) car toute modification de l'objet risque de modifier la clé et donc le classement.

    Si tu veux modifier l'objet tu sera donc contraint:
    • d'en récupérer une copie depuis l'itérateur obtenu lors de la recherche
    • de supprimer l'objet du set
    • de modfier la copie
    • d'insérer la copie modifiée dans le set


    A moins que tu ne choisisse de déclarer les membres modifiables comme étant mutable, mais cela implique que les membres déclaré comme tels ne devrait plus servir pour déterminer la clé.

    S'il est possible que la valeur de l'attribut soit identique dans plusieurs objets, il reste possible d'envisager l'utilisation de la multimap
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

Discussions similaires

  1. [XL-2007] Afficher une checkbox dans une feuille si une checkbox d'une autre feuille est cochée
    Par JessieCoutas dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 18/08/2009, 13h35
  2. portée d'une variable dans une fonction dans une méthode
    Par laurentg2003 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 29/06/2009, 19h05
  3. [POO] dans une classe, appeler une fonction dans une méthode
    Par arnaudperfect dans le forum Langage
    Réponses: 3
    Dernier message: 26/08/2007, 23h04
  4. Envoyer une formulaire dans une page dans une Frame
    Par zooffy dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 29/06/2007, 10h13
  5. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48

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