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

Langage C++ Discussion :

Parcours d'arbre, pointeur sur fonction


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mars 2009
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 16
    Par défaut Parcours d'arbre, pointeur sur fonction
    Bonjour !
    Dans le cadre de mes cours, je n'ai jamais eu l'occasion de voir les fonctionnalités "programmation fonctionnelle" du C++ et je cherche des pistes pour un certain algo. Voici le contexte.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class foo{
    public:
        void a(foo*);    // fonctions 
        int b();
    private:
        HashTable<key, foo*> enfants;
    }
    J'ai donc un arbre de foo, avec un nombre indéterminé de foo à chaque niveau.

    Je voudrais une sorte de forEach qui appliquerais a() ou b() à chaque enfant et sous enfant de mon arbre. Une fonction qui ne sert qu'à parcourir l'arbre et appliquer une fonction membre à chaque élément (ou, éventuellement, à chaque élément répondant à un critère).

    Par contre, je n'ai aucune idée de comment travailler avec des pointeurs sur fonction, etc.

    Quelqu'un a une piste ?

    Merci beaucoup d'avance !

    EDIT : Je ne peux utiliser que Qt et la STL, puisque c'est dans le cadre d'un cours (je tiens à spécifier que ce n'est pas l'essence du cours du tout (c'est un cours d'OpenGL), c'est un petit ajout personnel, pour satisfaire ma curiosité et donner un plus value à mon apprentissage)

  2. #2
    Membre averti
    Inscrit en
    Juillet 2009
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 35
    Par défaut
    Je ne connais pas l'implémentation de HashTable mais tu dois pouvoir récupérer le nombre d'éléments et l'accès à chaque élément, non ?

    A partir de là une fonction de parcours d'arbre toute bête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void parcourir(foo* f) {
     
    	f->b()
     
    	for(int i = 0 ; i < f->children.size() ; i++) { // remplace size par ce qui permet de récupére la taille
    		parcourir(f->children.get(i)); // remplace get par la méthode de récupération d'un élément de la hashtable
    	}
    }

  3. #3
    Membre chevronné
    Inscrit en
    Novembre 2006
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 362
    Par défaut
    Bonjour,

    Citation Envoyé par Abstrus Voir le message
    Je voudrais une sorte de forEach qui appliquerais a() ou b() à chaque enfant et sous enfant de mon arbre.
    Ca existe dans la STL et ça s'appelle std::foreach.

    Tu peux écrire ton propre foncteur, tu as un exemple ici.

    Bonne journée

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par Feriaman Voir le message
    Bonjour,



    Ca existe dans la STL et ça s'appelle std::foreach.

    Tu peux écrire ton propre foncteur, tu as un exemple ici.

    Bonne journée
    En fait, la vrai difficulté est d'écrire un itérateur adéquat pour parcourir l'arbre. Ensuite comme tu dis, les algos de la STL sont assez efficaces
    Pour construire ses itérateurs : Boost.Iterator.

  5. #5
    Membre chevronné
    Inscrit en
    Novembre 2006
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 362
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Pour construire ses itérateurs : Boost.Iterator.
    +1

    Le problème c'est que :
    Citation Envoyé par Abstrus Voir le message
    Je ne peux utiliser que Qt et la STL, puisque c'est dans le cadre d'un cours
    [EDIT]
    Cela dit, tu as complètement raison : ce n'est pas évident de construire l'itérateur en question. Si en plus cela sort du cour, ce n'est pas forcément la peine d'y passer une demi-journée.

    En gros, je pense qu'il suffit de faire une classe :
    - qui se déréférence en foo
    - qui s'incrémente (de façon à parcourir ton arbre quand même)
    - il doit falloir aussi surcharge "==" et "="

    Je ne sais pas trop ou trouver une référence sur le sujet
    [\EDIT]

    [EDIT 2]
    Pour le parcours de l'arbre j'opterais pour un méthode brute. L'idée n'est pas de faire quelque chose de performant, mais de comprendre le concept.

    Un vecteur qui à chaque profondeur associe le dernier élément de cette profondeur traité ou en cours de traitement me semble être une première approche suffisante.
    [\EDIT 2]

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Boost.Itérateur te fourni un cadre pour construire les itérateurs plus facilement. Mais leur construction from scratch n'est pas si complexe même si <iterator> propose le minimum vital.

Discussions similaires

  1. Réponses: 10
    Dernier message: 03/02/2005, 13h09
  2. Réponses: 5
    Dernier message: 12/01/2005, 20h58
  3. pointeurs sur fonction en C++
    Par cemoi dans le forum C++
    Réponses: 7
    Dernier message: 29/11/2004, 13h19
  4. [langage] Pointeur sur fonction
    Par Fanch.g dans le forum Langage
    Réponses: 2
    Dernier message: 02/10/2004, 10h43
  5. Declaration de fonction retournant un pointeur sur fonction
    Par pseudokifaitladifférence dans le forum C
    Réponses: 5
    Dernier message: 11/08/2003, 19h37

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