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

C++ Discussion :

Comment créer son propre iterator ?


Sujet :

C++

  1. #1
    Membre régulier Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Points : 95
    Points
    95
    Par défaut Comment créer son propre iterator ?
    Bonjour,

    Je suis en train de coder un nouveau lecteur audio, et pendant le code de ma bibliothèque audio, je me suis dit que ça pourrait être pratique d'utiliser un iterator de ma classe Playlist (contenant les chemins absolus de toutes les musiques chargées), pouvant être incrémenté, décrémenté, et "randomenté" ( ^^ ).

    J'ai vu sur la documentation de la STL que le Random Access Iterator était parfait pour moi. Cependant, je ne vois pas comment l'intégrer.

    Ma question est donc : que faire pour intégrer un iterator à une classe ? (je suppose qu'il faut définir begin(), end(), et dériver l'iterator du type standard [dont je ne connais pas le nom pour le RAI], mais cela m'est complètement flou...) Pourriez-vous détailler les étapes necessaires ?

    Merci d'avance.

  2. #2
    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 : 40
    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
    Voilà les spécifications du concept d'itérateur à accès aléatoire :
    http://www.sgi.com/tech/stl/RandomAccessIterator.html

    Avec ça tu devrais pouvoir implémenter le tien

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 258
    Points : 307
    Points
    307
    Par défaut
    Citation Envoyé par kidpaddle2
    Ma question est donc : que faire pour intégrer un iterator à une classe ? (je suppose qu'il faut définir begin(), end(), et dériver l'iterator du type standard [dont je ne connais pas le nom pour le RAI], mais cela m'est complètement flou...) Pourriez-vous détailler les étapes necessaires ?
    Classiquement, il faut créer une classe iterator imbriquée dans ta classe, qui implémente les fonctions décrites dans la doc du RandomAccessIterator. Il n'y a pas de classe standard de laquelle dériver, il suffit que ta classe d'itérateur respecte l'interface décrite.

  4. #4
    Membre régulier Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Points : 95
    Points
    95
    Par défaut
    Merci, mais j'avais déjà visité cette page. J'aimerais plutôt savoir comment créer un itérateur sans pour autant le créer complètement (un héritage de random_access_iterator [classe qui me semble être un iterator adapté], par exemple) : en gros, utiliser bêtement un random_access_iterator pour ma classe Playlist. Le cas échéant, que dois-je effectuer comme modifications ?

  5. #5
    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 : 40
    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
    Les itérateurs ne sont que des concepts, devant respecter certaines règles selon leur catégorie. Il n'y a pas de classe de base magique qui ferait tout. Mais bon, globalement un random acces iterator, c'est un pointeur... (VC6 ne faisait qu'un typedef sur T* pour vector<T>::iterator).

  6. #6
    Membre régulier Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Points : 95
    Points
    95
    Par défaut
    Bon, d'accord. A ce moment là (car la documentation donnée me paraît un peu floue), si je ne veux qu'utiliser l'incrémentation et la décrinmentation ainsi qu'une incrémentation aléatoire (pour le shuffle) et un accès par index (par double clic dans la liste de lecture) de mon itérateur, que dois-je faire comme modifications ? Comment se compose une fonction begin() / end() ? et l'itérateur en lui-même ? Auriez-vous un exemple que je puisse étudier ?

    Ca fait beaucoup de questions, je sais. Mais plus j'y pense et plus je me dis que c'est nécessaire, et je ne vois pas comment ça se passe...

  7. #7
    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 : 40
    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
    Auriez-vous un exemple que je puisse étudier ?
    Il y en a plein dans la STL

  8. #8
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Pour que ton itérateur puisse utilsier les algos de la STL, il est intéressant de dériver de std::iterator<> qui indique quel est le type d'itérateur, le type de données, le type de pointeur et le type de référence. Ca permet de définir des proxys, entre autres, facilement.
    VS2005 utilise une structure de traits pour ces données.

  9. #9
    Membre régulier Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Points : 95
    Points
    95
    Par défaut
    J'ai cru voir que dériver de std::iterator<> ne servait à rien (j'ai regardé dans les headers de la STL, et c'est effectivement le cas (en plus d'une indentation exécrable qui m'a empêché d'aller plus loin )... pourrais-tu t'expliquer, Miles ? Je ne comprends pas ce que tu as voulu dire...

    Ce que j'essaie de faire est vraiment simple, ça m'étonne qu'il n'y ait rien de "tout fait" pour cela : comme le dit Stroustrup, "don't create what's already created"...

  10. #10
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    std::iterator possède simplement 4 typedef, le premier indique le type d'itérateur, c'est quasiment la seule chose à savoir.

Discussions similaires

  1. Réponses: 14
    Dernier message: 15/01/2014, 15h37
  2. Comment créer son propre Widget Gtkmm?
    Par Greensource dans le forum GTK+ avec C & C++
    Réponses: 2
    Dernier message: 08/04/2009, 11h41
  3. Comment creer son propre iterator
    Par Sebou dans le forum SL & STL
    Réponses: 1
    Dernier message: 02/06/2008, 12h42
  4. Comment créer son propre logo ?
    Par jojo_ol76 dans le forum Imagerie
    Réponses: 7
    Dernier message: 15/01/2008, 15h03
  5. Comment créer son propre logiciel de gestion ?
    Par Sayanne dans le forum Autres Logiciels
    Réponses: 8
    Dernier message: 11/04/2006, 18h03

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