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 :

map et set - clefs separées


Sujet :

SL & STL C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 366
    Points : 116
    Points
    116
    Par défaut map et set - clefs separées
    Bonjour,

    J'ai regardé le graph de la faq pour l'utilisation de conteneurs.
    Le dernier choix pour lutiliser une map ou un set est le fait d'avoir les clefs et valeurs separées - et je n'arrive pas a a l'interprete sur un cas comme ci dessous:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    class Unite
    {
    public:
        std::string mUnite;
        double mCoeff;
    };
     
    class Manager
    {
    public:
        std::map<std::string, Unite>  mPoolUnite; // Cle = Unite::mUnite
        // Ou std::set ?
    };
    La clef de ma map n'est que la string mUnite de Unite, donc elles ne sont pas separées, mais je ne vois pas en utilisant un set comment apres recuperer mes valeurs par rapport a cette clef..

    Merci d'avance pour votre aide.

  2. #2
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 620
    Points
    15 620
    Par défaut
    Bonjour

    Je te laisse rechercher dans le forum pour tous les problèmes d'accessibilité aux variables membres, à la sémantique d'entité, etc (ou je laisse un autre compléter)...

    Pour ton problème spécifique, il suffit que ta classe Unite soit comparable, càd qu'il faut lui fournir un opérateur de comparaison < ou spécialiser la fonction Less

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 366
    Points : 116
    Points
    116
    Par défaut
    Merci pour ta reponse,

    Dois je aussi re-preciser l'operateur == afin qu'il puisse savoir si un element est deja inseré ? (mon egalite ne porte que sur ma string)

    Question annexe sur une map pour ne pas recrrer un post:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    std::map<std::string, K*> mMap;
    K * k1 = new K(...);
    K * k2 = new K(...);
    mMap["test"] = k1;
    // ...
    // On travaille et perd l'adresse du k1
    // ...
    mMap["test"] = k2;
    L'insertion du k2 remplace donc le k1 et vu qu'on n'a pas stocké k1 on ne peut plus delete;
    Doit on donc passer par une recherche de l'element, le supprimer s'il existe et enfin inserer le nouveau ?

  4. #4
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 620
    Points
    15 620
    Par défaut
    Pour =, je sais plus, mais probablement que oui (le compilateur te le dira si c'est le cas). Par contre, attention à la sémantique

    Pour map, oui, il faut faire un find pour vérifier qu'un élément existe et le supprimer si nécessaire (ou multimap si tu veux avoir plusieurs éléments avec la même clé), ou utiliser un pointeur intelligent

  5. #5
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par sone47 Voir le message
    Merci pour ta reponse,

    Dois je aussi re-preciser l'operateur == afin qu'il puisse savoir si un element est deja inseré ? (mon egalite ne porte que sur ma string)
    Tu n'en n'a pas "besoin", car dans ta map, pour tester l'égalité, il se base sur l'opératuer < uniquement : si on n'a pas a<b, et que l'on n'a pas b<a, dans ce cas, il considère a==b.

    Maintenant, pour d'autres usages de ta map, où tu pourrais être moins prudent, il me semble intéressant de définir l'opérateur == quand même (et qu'il donne les mêmes résultats que le tests à base d'operator<).

    Citation Envoyé par sone47 Voir le message
    Question annexe sur une map pour ne pas recrrer un post:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    std::map<std::string, K*> mMap;
    K * k1 = new K(...);
    K * k2 = new K(...);
    mMap["test"] = k1;
    // ...
    // On travaille et perd l'adresse du k1
    // ...
    mMap["test"] = k2;
    L'insertion du k2 remplace donc le k1 et vu qu'on n'a pas stocké k1 on ne peut plus delete;
    Oui, mais comme c'est très simple de se planter, il vaut mieux ne pas avoir des map de pointeurs, mais des map d'objets pour lesquels on n'a pas besoin de faire manuellement d'effacements, par exemples des map<string, shared_ptr<K>> ou (si ton compilateur les supporte) des map<string, unique_ptr<K>>
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 366
    Points : 116
    Points
    116
    Par défaut
    Ok merci beaucoup pour vos réponses.
    J'utilise un set sur des objets et non plus des pointeurs et j'ai definie <
    Je regarderais après pour les passer en pointeur intelligent mais ca n'est pas la prio car petits objets et petits stockage.

    Merci

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

Discussions similaires

  1. Mapping de <set>
    Par Maxime Dupaul dans le forum Hibernate
    Réponses: 4
    Dernier message: 19/05/2011, 10h58
  2. map ou set ?
    Par Mindiell dans le forum SL & STL
    Réponses: 16
    Dernier message: 31/05/2010, 17h10
  3. Mapping collection <set>
    Par myrmidia dans le forum Hibernate
    Réponses: 5
    Dernier message: 14/08/2008, 13h20
  4. Relation Parent/Fils - Mapping et Set
    Par --cycy dans le forum Hibernate
    Réponses: 1
    Dernier message: 17/09/2007, 17h52
  5. Réponses: 4
    Dernier message: 08/03/2006, 13h22

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