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 :

[conception] set de pointeurs


Sujet :

SL & STL C++

  1. #1
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut [conception] set de pointeurs
    Bonjour tout le monde,

    je suis confronté à un problème qui parait simple de prime abord, mais qui s'est avéré plus ardu que prévu (à moins que ce soit moi qui, à force de me triturer les méninges, cherche trop la complication). Je m'explique:

    J'ai des événements à traiter. Pour ce post, nous pouvons considérer ces événements comme une structure qui comprend un poids et un pointeur de fonction.

    J'ai plusieurs type d'événements. J'ai donc une classe mere Event, et plusieurs classes fille.

    Je dois stocker mes événements dans un conteneur. Ils doivent être triés selon leur poids. J'ai donc opté pour un std::set.

    Problème: étant donné que mon set va contenir differents type d'evenements, je suis contraint de n'y stocker que des pointeurs: std::set<Event*>.

    => Du coup, je ne peux pas implémenter mon opérateur < pour m'assurer de la façon dont vont être triés mes événements dans le set.

    Question: y a-t-il quelque chose qui cloche dans mon raisonnement? Si non, quelle est la solution? (créer une classe Bidon qui va contenir un Event* et faire un set de cette classe Bidon ne me plait guère...)

  2. #2
    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 : 50
    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
    Par défaut
    set prend un paramètre template optionnel permettant de spécifier un comparateur pour tes objets.
    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.

  3. #3
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    merci JolyLoic,

    mais en fait, maintenant que j'y repense, je ne peux pas utiliser un set car je dois pouvoir stocker des événements qui ont le même poids

    Du coup je ne sais pas trop quel conteneur utiliser. Une list (ou une queue) serait pas mal mais ça m'obligerait à implémenter une fonction d'insertion moi-même puisque je veux que le conteneur reste trié.

  4. #4
    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 : 50
    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
    Par défaut
    J'ai oublié que je voulais ajouter un autre commentaire :
    Set ne me semble pas adapté à ce genre de choses, car il peut y avoir des égalités

    Pour ça, deux possibilités :
    - Un multiset (mais l'interface n'est pas forcément formidable pour ça).
    - Une priority_queue, qui est fait pour ce genre de chose, tant que le seul traitement que tu veux faire sur un élément inséré est de le retirer quand il est en première position...
    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.

  5. #5
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    Vi. En fait, ce que je veux faire c'est une sorte de séquenceur "général". Général dans le sens où les événements sont de nature vraiment différente.

    Je viens de voir qu'en effet, une solution est possible avec un multiset, je vais voir maintenant ce que ça donne avec une priority queue.


  6. #6
    Membre chevronné
    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
    Par défaut
    Citation Envoyé par r0d Voir le message
    je ne peux pas utiliser un set car je dois pouvoir stocker des événements qui ont le même poids
    Dans quel ordre doivent être les éléments de même poids?

  7. #7
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    Le plus faible en tête.

    Aujourd'hui j'ai un algo qui fonctionne, mais je pense que je peux faire mieux. Pour l'instant, j'utilise un multiset. L'algorithme que j'ai mis en place est le suivant:
    -> Le séquenceur possède le multiset d'événements. J'en ai fais un singleton de façon à ce que des événements puissent être ajoutés facilement par tous les objets de l'appli.
    -> Mon appli fonctionne en frame constante, c'est à dire que chaque boucle du "mainframe" dure le même nombre de millisecondes
    -> A chaque boucle, l'execution des événements se passe en 3 phases:
    1/ je décrémente le poids de tous les événements de mon multiset de 1
    2/ j'execute tous les événements dont le poids est négatif
    3/ je supprime tous les evenement dont le poids est négatif (en faisant un find_first_of puis un swap ).

    edit: pour l'instant, le nombre d'événements présents dans mon multiset ne dépasse pas 20.

    edit2: oops, j'avais mal compris ta question
    Donc en fait, l'ordre des événements de même poids n'a aucune importance.

  8. #8
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Citation Envoyé par corrector Voir le message
    Dans quel ordre doivent être les éléments de même poids?
    Citation Envoyé par r0d Voir le message
    Le plus faible en tête.
    J'allais répondre:

    On a enfin trouvé une notion d'ordre qui permet de répondre à la question "quel est le plus lours entre 1kg de plomb et 1kg de plume ?" et personne ne m'a prévenu ?

    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  9. #9
    Membre chevronné
    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
    Par défaut
    Citation Envoyé par r0d Voir le message
    1/ je décrémente le poids de tous les évènements de mon multiset de 1
    Concrètement, comment fais-tu?

  10. #10
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    avec un foncteur et un for_each. Pourquoi?

  11. #11
    Membre chevronné
    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
    Par défaut
    Citation Envoyé par r0d Voir le message
    avec un foncteur et un for_each. Pourquoi?
    Primo, parce que la clef est constante : map<K,E>::element_type est pair<const K, E> !

    (Le principe de tous les conteneurs associatifs standard est que la clef est déclarée const.)

  12. #12
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    C'est vrai ça... ça ne devrait pas marcher normalement

    Et puis ce que tu dis là met à jour une contradiction dans mon algo: je modifie la clé des éléments de mon conteneur associatif.

    ps: je n'ai pas le code (celui dont je parle dans ce topic) sous les yeux, je vérifierai ça demain.

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 22/12/2013, 12h05
  2. trier un set de pointeurs?
    Par evrybody dans le forum Langage
    Réponses: 9
    Dernier message: 09/01/2010, 16h20
  3. set<Pointeur*> mal trié
    Par laflak dans le forum SL & STL
    Réponses: 14
    Dernier message: 21/12/2008, 23h31
  4. Conception: stocker les pointeurs de fonction
    Par progfou dans le forum C++
    Réponses: 4
    Dernier message: 11/04/2008, 17h44
  5. Réponses: 4
    Dernier message: 13/08/2004, 18h39

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