Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 6 sur 6
  1. #1
    Membre régulier
    Inscrit en
    novembre 2006
    Messages
    350
    Détails du profil
    Informations forums :
    Inscription : novembre 2006
    Messages : 350
    Points : 79
    Points
    79

    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 :
    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 Guillaume Belz
    Biochimiste
    Inscrit en
    novembre 2008
    Messages
    5 318
    Détails du profil
    Informations personnelles :
    Nom : Homme Guillaume Belz
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Biochimiste
    Secteur : Santé

    Informations forums :
    Inscription : novembre 2008
    Messages : 5 318
    Points : 17 319
    Points
    17 319

    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
    Inscrit en
    novembre 2006
    Messages
    350
    Détails du profil
    Informations forums :
    Inscription : novembre 2006
    Messages : 350
    Points : 79
    Points
    79

    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 :
    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 Guillaume Belz
    Biochimiste
    Inscrit en
    novembre 2008
    Messages
    5 318
    Détails du profil
    Informations personnelles :
    Nom : Homme Guillaume Belz
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Biochimiste
    Secteur : Santé

    Informations forums :
    Inscription : novembre 2008
    Messages : 5 318
    Points : 17 319
    Points
    17 319

    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 Loïc Joly
    Développeur informatique
    Inscrit en
    août 2004
    Messages
    4 963
    Détails du profil
    Informations personnelles :
    Nom : Homme Loïc Joly
    Âge : 40
    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 : 4 963
    Points : 11 268
    Points
    11 268

    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 :
    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.
    Et celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++

  6. #6
    Membre régulier
    Inscrit en
    novembre 2006
    Messages
    350
    Détails du profil
    Informations forums :
    Inscription : novembre 2006
    Messages : 350
    Points : 79
    Points
    79

    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •