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
    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  
    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
    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  
    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

    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
    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