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 :

Conteneur ordonné avec unicité ?


Sujet :

SL & STL C++

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut Conteneur ordonné avec unicité ?
    Bonjour,

    J'aurais besoin d'une séquence de chaînes de caractères du style "dernière entrée, première sortie", mais avec garantie de l'unicité.

    Apparemment, la STL n'offre rien de cela (?).

    Comment procéderiez-vous ?

    Une list avec par la suite une suppression des doublons via un des algorithmes offerts par la STL ?

    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 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 035
    Par défaut
    Salut.
    Peut être une deque
    http://www.sgi.com/tech/stl/Deque.html
    et l'algo std::find_if pour voir si l'objet n'existe pas.

    Pour info, il existe maintenant unordered_set ,mais j'ai aucune idée si cela correspondra vraiment à ce que tu veut...

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Ou un stack, auquel j'applique l'algorithme unique_copy ?

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 035
    Par défaut
    Citation Envoyé par oodini Voir le message
    Ou un stack, auquel j'applique l'algorithme unique_copy ?
    stack c'est dernier entrée -> premier sortie et l'algorithme unique fait la comparaison uniquement sur les éléments consécutif :
    {1,1,1,1,2,3,4,5,1}
    donnera
    {1,2,3,4,5,1}

    http://r0d.developpez.com/articles/algos-stl/#LII-B-8

  5. #5
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 035
    Par défaut
    ou peut être une list avec le find_if.

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Citation Envoyé par Mongaulois Voir le message
    stack c'est dernier entrée -> premier sortie
    Je m'étais en fait trompé dans le post initial.

    et l'algorithme unique fait la comparaison uniquement sur les éléments consécutif :
    {1,1,1,1,2,3,4,5,1}
    donnera
    {1,2,3,4,5,1}
    Aïe...

    Y'a sûrement moyen de faire quelque chose avec un map.
    Je fais mon stack, et ensuite, je crée un map avec comme clés les chaînes de caractères, et comme valeur le "classement" de la première occurence dans le stack. Puis je reconstruis un vecteur à partir du map.

    Un peu tiré par les cheveux, mais bon...

  7. #7
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Par construction un stack est dernier entré, premier sorti.
    Un conteneur de type deque semble plus approprié pour obtenir le FIFO.
    Si nous souhaitons en plus que la chaîne de caractère soit "unique", il y a deux approches:
    • comparer une chaine à insérer à l'ensemble des chaines de la liste,
    • créer un map qui servira à tester l'existence de la chaine.

    Le résultat sera le même, les performances varient en fonction du nombre de chaines de caractères qui seront dans la liste à l'instant T.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  8. #8
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 035
    Par défaut
    http://www.sgi.com/tech/stl/stack.html
    By default that underlying type is deque, but a different type may be selected explicitly.
    Utiliser une deque, un vector ou une list à la place de la stack pourrais surement le faire.

    Mais vue que tu doit avoir accès au élément pour tester l'unicité à chaque fois,
    un vector sera surement plus optimisé par rapport à la liste (mémoire contigüe). vector vs deque, aucune idée. Je ne connais pas deque.

    Aprés pour tester l'unicité, le std::find.
    [edit] Ou comme le propose wiztricks, peut être utiliser un autre centenaire comme le set ou map en parallèle.

  9. #9
    Membre émérite Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Je crois que je vais gérer l'aspect FIFO en amont pour travailler en LIFO avec un vector, puis lors de l'utilisation des éléments, utiliser une map.

    Si l'élément traité du vector n'est pas dans la map, je le rajoute, et je fais mon traitement avec cet élément. Autrement, je zappe et passe à l'élément suivant dans le vector.

  11. #11
    Membre émérite Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Par défaut
    Citation Envoyé par oodini Voir le message
    Je crois que je vais gérer l'aspect FIFO en amont pour travailler en LIFO avec un vector, puis lors de l'utilisation des éléments, utiliser une map.

    Si l'élément traité du vector n'est pas dans la map, je le rajoute, et je fais mon traitement avec cet élément. Autrement, je zappe et passe à l'élément suivant dans le vector.
    Il y a des conteneurs déjà adaptés pour ça.

    FIFO : std::queue<>
    LIFO : std::stack<>

    Et ce n'est pas une map que tu dois utiliser pour l'unicité, c'est un std::set<>.
    std::map<> est une table associative.

  12. #12
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    En fait, ce problème s'imbrique un autre, et je vais sans doute utiliser une liste et un map, la valeur de ce dernier mes servant à autre chose.
    Faut que je résolve des problèmes de conception.

    Je vous tiens au courant ! Merci à tous !

  13. #13
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    399
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 399
    Par défaut
    Citation Envoyé par HanLee Voir le message
    Il y a des conteneurs déjà adaptés pour ça.

    FIFO : std::queue<>
    LIFO : std::stack<>
    Ce sont des adapteurs de conteneurs. Apres c'est toi qui choisi quel conteneur doit etre encapsulé (avec des restrictions eveidemment). Par défaut je crois que c'est une deque pour les 2 car ca peu a la fois gérer le FIFO et le LIFO (un vector est très adapté au LIFO cependant). L'adapteur va te fournir une interface simplifiée sur le conteneur en dessous qui te permet uniquement de gérer le comportement désiré.
    SPARK
    Moteur de particule C++ opensource avec modules de rendu OpenGL, Irrlicht et SFML

Discussions similaires

  1. Probleme conteneur list avec objet
    Par Dominus_Domi dans le forum Débuter
    Réponses: 9
    Dernier message: 17/03/2011, 18h20
  2. saveOrUpdate avec unicité
    Par Cogueran dans le forum Hibernate
    Réponses: 3
    Dernier message: 30/11/2010, 12h03
  3. Le conteneur vector avec les objets
    Par HK1989 dans le forum C++
    Réponses: 4
    Dernier message: 08/02/2009, 16h22
  4. tableau d'entiers avec unicité d'élements
    Par s-ehtp dans le forum C
    Réponses: 6
    Dernier message: 12/04/2008, 22h29
  5. Ordonner avec une sous requête ,possible ou pas?
    Par worm1 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 20/02/2007, 06h23

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