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 :

Création d'iterateurs persos


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Doctorant en Astrophysique
    Inscrit en
    Mars 2009
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Astrophysique
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2009
    Messages : 312
    Par défaut Création d'iterateurs persos
    Bonjour.

    Je suis en train de coder un octree pour un code de maillage adaptatif où j'ai un arbre de classes "AbstractGrid". Chacune de ces "AbstractGrid" contient un pointeur vers sa grille parent et un tableau de pointeurs vers ses grilles filles si elle en a.

    Avant de passer à la suite, 2 précisions :
    - je connais assez mal les itérateurs, mon utilisation s'étant limitée à faire des boucles sur le contenu de vectors...
    - je n'utilise pas boost::graph car j'ai besoin d'optimisations liées à mon octree spécifique pour à terme pouvoir optimiser la gestion de plusieurs centaines de milliards de grilles de façon parallèle en minimisant l'empreinte mémoire

    J'aimerai créer des itérateurs persos pour parcourir mon arbre de grilles de plusieurs façons et j'aurai plusieurs questions
    1) Existerait-il un tutorial expliquant par l'exemple comment créer des iterateurs pour des conteneurs spéciaux ?
    2) J'aurai besoin de parcourir mon arbre de plusieurs façons (par exemple pouvoir itérer sur des plus proches voisins ou pouvoir itérer sur des grilles filles), est-ce que cela signifie que je devrais coder un itérateur associé à chaque façon de me balader dans mon arbre ?
    (3) je sens que je vais me faire crier dessus mais ce n'est pas grave: je n'ai jamais bien compris la différence entre des iterator et des const iterator (est-ce juste que le const iterator est un itérateur "en lecture seule" permettant uniquement d'utiliser les méthodes constantes de ce vers quoi il pointe ?))

    Merci beaucoup.

  2. #2
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    Bonjour,

    1/ Dans l'idée, fournir une classe d'itérateur pour un conteneur, c'est juste founir une classe qui respecte les conditions fournit par la norme pour être un itérateur. Prends un draft de la norme, choisi quel genre d'itérateur tu veux faire, et implémentes l'ensemble des fonctions indiqués.

    NB: Si tu as déjà utilises des itérateurs tu devrais savoir quelles sont ces fonctions (++,*,ect).

    http://www.boost.org/doc/libs/1_49_0...doc/index.html devrait aussi pouvoir te donner des idées et sera plus lisible que la norme pour une première approche.

    2/ Oui, après selon comment tu mets ca en place soit tu peux avoir une classe par type d'itérateur, soit une seule classe template avec une tag classe, c'est à toi de voir

    3/ Oui c'est ca, un itérateur non constant permet d'itérer sur un ensemble et d'en modifier les valeurs, un itérateur constant permet juste de parcourir l'ensemble sans en modifier les valeurs (et ni l'un ni l'autre ne permettent de modifier la structure du conteneur : ajouter/enlever un élément).

  3. #3
    Membre expérimenté Avatar de Rewpparo
    Homme Profil pro
    Amateur
    Inscrit en
    Décembre 2005
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 170
    Par défaut
    Personellement dans le cas d'arbres, plutot que des itérateurs j'aime faire des listes intrusives, c'est a dire que la liste est contenue dans les node. Chaque node a les fonctions suivantes :
    Node* getFirstChild()
    Node* getNextSibling()
    Node* getPreviousSibling() (optionnel)
    Node* getParent()
    Chaque node stocke son parent, un enfant, et le frère suivant (+ précédent ?).
    Ca permet d'itérer ton arbre comme tu veux, ou de faire du bon petit récursif allègrement.
    Par contre chaque node ne peut faire partie que d'un arbre à la fois, mais c'est rarement une limitation.

    Astuce suplémentaire : Tu peux rendre les listes de frères circulaires, c'est a dire que quand tu arrives en bas de la liste, tu peux toujours appeller next qui te renverras au début de la liste. Ton critère pour savoir si tu as tout parcouru est de vérifier si tu ne retombes pas sur l'élément par lequel tu as commencé.
    Ca permet de simplifier largement le code, en se débarassant de tous les cas particuliers des limites de la liste, et donc d'accélérer le code. Ca permet également d'itérer la liste des enfants en disposant uniquement d'un enfant quelconque, et sans avoir besoin de toucher ni même de connaitre le parent.

    Boost propose une implémentation je crois, mais je ne l'ai pas étudiée en détail.
    Explication du concept sur un blog anglophone


    Juste pour te présenter d'autres options que la facon de voir très STL que tu as. Ta démarche reste tout à fait valable.

Discussions similaires

  1. Création des repertoires perso sous Active Directory
    Par ouakammathieu dans le forum Windows Serveur
    Réponses: 3
    Dernier message: 05/08/2009, 19h07
  2. problème création tag tld perso lors de l'affichage
    Par eniraka dans le forum Struts 1
    Réponses: 1
    Dernier message: 07/01/2008, 22h31
  3. [VB.NET 2003] Création de contrôles persos
    Par Kropernic dans le forum Windows Forms
    Réponses: 17
    Dernier message: 15/10/2007, 13h05
  4. Probleme operateur classe iterateur perso
    Par SOAD08 dans le forum C++
    Réponses: 2
    Dernier message: 14/02/2007, 19h03
  5. [débutant] création de composants perso
    Par thiouwz dans le forum AWT/Swing
    Réponses: 7
    Dernier message: 07/11/2006, 17h59

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