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 :

Ecrire un iterator


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par défaut Ecrire un iterator
    J'ai essayé d'écrire un iterator afin de l'utiliser avec les <algorithm>s. Mais il y a des petits soucis lorsque les algos appellent implicitement std::advance() ou std::distance(), entre autres.
    J'ai donc un peu farfouillé les sources de VC6 puis VS2005, mais l'approche semble différente, difficile donc de faire du code compatible/portable. L'approche est d'ailleurs un peu lourdingue: il faut hériter son iterator de certaines classes de base (ranit par exemple). Oui mais lesquelles, et est-ce standard ?

  2. #2
    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
    Vendredi soir donc une réponse rapide :
    Tu peux regarder ici, c'est expliqué.
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    template<class T>
    class CMonIterateur :public std::iterator<std::input_iterator_tag,T>
    {
    // .. blabla
    };
    Sinon, boost.Iterator fournit des classes pour t'aider à construire tes propres itérateurs.

  3. #3
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Boost propose Iterator Facade, qui rend l'écriture d'itérateurs plus facile.

  4. #4
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par défaut
    3Darchi, merci, ça marche très bien !

    J'ai écrit un iterator permettant d'accéder à des données sur disque (un fichier, ça aurait pu être un pipe ou autre). Les données ne sont donc pas en mémoire dans un conteneur quelconque.
    Lors du déréférencement via l'operator*() je renvois un smart pointer (par valeur). En général l'operator*() renvoit une référence sur un objet conservé dans un conteneur, donc quelque part en mémoire, ce qui n'a pas de sens dans mon cas. J'ai donc un truc comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class iterator:
     public std::iterator<std::random_access_iterator_tag,smart_ptr<T> >
    {
     ...
    public:
     smart_ptr<T> operator*() const
     {...}
     ...
    };
    Je me demande s'il y a des règles à respecter pour l'écriture d'un iterator. Ici par exemple, j'ai dérogé aux "habitudes" de la stl en écrivant value_type operator*() const au lieu de reference operator*() const, mais je n'avais pas le choix. Est-ce grave docteur ?

  5. #5
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Sauf erreur, tu as un smart pointer qui se "balade quelque part en mémoire", qui est accessible et qui manipule les données de ton fichier...

    Or il est (toujours sauf erreur) tout à fait possible de... renvoyer une référence sur smart pointer.

    Dés lors, pourquoi déroger à la règle, et risquer des problèmes
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  6. #6
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Sauf erreur, tu as un smart pointer qui se "balade quelque part en mémoire", qui est accessible et qui manipule les données de ton fichier...
    Comment puis-je renvoyer une référence sur un objet local ? Car bien sûr le smart pointer est créé dans la fonction operator*(). Conceptuellement le code est comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    smart_ptr<T> operator*()
    {
     create buffer for T;
     read from file into buffer;
     declare a local smart pointer and assign the buffer to it;
     return the smart pointer;
     //let die the buffer with the smart pointer anywhere else, but here
    }

Discussions similaires

  1. Iteration VS recursivité
    Par yacinechaouche dans le forum C
    Réponses: 40
    Dernier message: 16/11/2012, 11h52
  2. Ecrire dans un fichier sans supprimer le reste
    Par koan_sabian dans le forum Linux
    Réponses: 4
    Dernier message: 20/02/2003, 15h44
  3. [VB6] Ecrire/Modifier/Effacer ds un fichier text-4 Chs/Lg
    Par Jonathan_Korvitch dans le forum VB 6 et antérieur
    Réponses: 18
    Dernier message: 24/12/2002, 18h54
  4. [VB6] Ecrire à un endroit précis d'un richtextbox
    Par STG dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 26/11/2002, 14h35
  5. ecrire son OS (assembleur ??)
    Par Anonymous dans le forum Programmation d'OS
    Réponses: 9
    Dernier message: 25/11/2002, 19h25

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