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 :

set, un conteneur associatif, qui n'associe rien ?


Sujet :

SL & STL C++

  1. #1
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut set, un conteneur associatif, qui n'associe rien ?
    Pour leur donne-t-on le nom de conteneurs associatifs ?

    Une map ou une multimap associe bien une clef à un élément, mais un set est juste un ensemble trié ? Pourquoi l'affubler du nom d'associatif ?

    Merci.

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par NiamorH Voir le message
    Pour leur donne-t-on le nom de conteneurs associatifs ?

    Une map ou une multimap associe bien une clef à un élément, mais un set est juste un ensemble trié ? Pourquoi l'affubler du nom d'associatif ?

    Merci.
    Peut etre :
    Parce que la nature des éléments est impoprtante?
    Puis que c'est ce qui permet de les trié?
    et surtout parce que l'on n'as pas le droit de changer leur ordre? => association entre les elements

  3. #3
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    C'est juste un cas de particulier de conteneur associatif où la clé et l'élément sont confondus. Mais à part ça, cela ne diffère en rien d'un autre conteneur associatif tel que std::map.

  4. #4
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    Ok, je reste un peu sur ma faim, mais je comprends à peu près.

  5. #5
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Dans le set, les clés sont portés par les objets eux-même. Ils en possèdent déjà une. Par contre, comme tu le sais déjà, la map introduit une clé externe pour chaque élément.

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    J'ignorais que les set étaient appelés "associatifs"... Et je dois dire que j'en suis surpris aussi.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre éclairé Avatar de befalimpertinent
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Avril 2007
    Messages : 561
    Points : 833
    Points
    833
    Par défaut
    Si je peux rajouter une question allant dans le même sens : quelqu'un sait t'il s'il y a un ancêtre commun à la map et au set au sens héritage définit dans la STL ? Quelque chose qui pourrait s'appeler AssociativeContainer et duquel hériterait les deux containers ?

    Qui a la réponse répond à la question initiale...
    Linux > *

  8. #8
    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
    Non, il n'y a pas d'héritage entre conteneurs de la STL. La généricité de la STL n'est pas gérée par une interface au sens POO, mais par un concept (non explicitable dans le code actuellement ) au sens template.

    Pour la question initiale, set est une conteneur associatif parce que c'est comme ça, faut pas chercher à comprendre, circulez, ya rien à voir
    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.

  9. #9
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    Pour la question initiale, set est une conteneur associatif parce que c'est comme ça, faut pas chercher à comprendre, circulez, ya rien à voir
    C'est bien l'impression que j'en ai !

  10. #10
    Provisoirement toléré
    Profil pro
    Inscrit en
    Février 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 439
    Points : 495
    Points
    495
    Par défaut
    Citation Envoyé par NiamorH Voir le message
    Pour leur donne-t-on le nom de conteneurs associatifs ?

    Une map ou une multimap associe bien une clef à un élément, mais un set est juste un ensemble trié ? Pourquoi l'affubler du nom d'associatif ?
    Tu vois peut-être une map<K, D> comme associant une donnée D à la clef K :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void f (std::map<K, D> &m, K k) {
        D d = m[k];
    }
    mais c'est plus le point de vue de operator[].

    Une map associe un élément à une clef : map<K, D>::element_type étant défini comme pair<const K, D>, map associe pair<const K, D> à K. C'est l'opération effectuée par find, qui est l'opération cruciale (je n'ose dire "opération clef") :
    find (k)->first = k

    Un set associe K à K :
    *find (k) = k

    En fait, les deux sont généralement implémentés en terme de rbtree<K, E, Pi>, qui associe un E à K, avec Pi : E -> K, tel que :
    Pi()(*find (k)) = k

    ce qui permet naturellement de définir set<K> à partir de
    rbtree<K, K, Id>
    (où Id() est l'identité)
    et map<K, D> à partir de
    rbtree<K, pair<const K, D>, First>
    (avec First()(x) = x.first)

    Bien sûr, j'ai simplifié, il y a aussi le comparateur à passer, et un paramètre pour choisir entre conteneur à clef unique (set, map) et conteneur à clef multiples (multiset, multimap).

    Les hash_(multi)set/map sont définis pareil, en terme de hashtable<K,E,Pi,etc.>

    Malheureusement, rien de tout ça n'est standard, et on doit supporter l'insupportable interface de set et compagnie, garantie "sure pour les bébés".

Discussions similaires

  1. Requete OR qui ne ramene rien
    Par Sapience dans le forum Langage SQL
    Réponses: 10
    Dernier message: 14/04/2005, 12h12
  2. procédure stockée qui ne fait rien
    Par trotters213 dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 10/03/2005, 20h25
  3. Réponses: 11
    Dernier message: 17/01/2005, 16h58
  4. Conteneurs associatifs à clés dupliquées
    Par Christophe Brun dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 04/07/2004, 14h16
  5. [LG]Programme qui n'affiche rien
    Par ousunas dans le forum Langage
    Réponses: 4
    Dernier message: 17/02/2004, 19h38

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