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

Boost C++ Discussion :

Boost Iterator et Writable Iterators


Sujet :

Boost C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 47
    Par défaut Boost Iterator et Writable Iterators
    Bonjour à tous,

    Voilà, j'ai utiliser Boost Iterator pour implémenter des itérateurs bidirectionnels en me basant sur cette page.

    Le problème, c'est que je trouve la documentation de Boost incompréhensible pour ce qui est des Writable Iterators. Avec mon itérateur bidirectionnel, j'aimerais pouvoir faire par exemple :

    *it = 5;

    it étant par exemple un itérateur sur une structure contenant des entiers.

    Comment puis-je faire ça ?

    Merci

  2. #2
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Si ton itérateur est mutable alors operateur* renvoie une référence et donc tu peux modifier la valeur pointée.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 47
    Par défaut
    Merci pour la réponse,

    c'est tout à fait vrai, mais ça ne fonctionne pas.

    Si j'essaye de faire dans mon code de test :

    g++ me dit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error: lvalue required as left operand of assignment
    la fonction de déréférencement est comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    template <typename T>
    T& ImageIterator_NotPlanar<T>::dereference() const {
      return *((T*)buffer);
    }
    rien de bien sorcier...

    Que se passe t-il ?

    Merci

  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
    La vérité est ailleurs. J'ai repris l'exemple simple et cela fonctionne parfaitement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    #include <boost/iterator/iterator_facade.hpp>
     
    template <class Value>
    class my_iterator
      : public boost::iterator_facade<
            my_iterator<Value>
          , Value
          , boost::incrementable_traversal_tag
        >
    {
     public:
        my_iterator()
           :m_buffer(0)
        {}
        explicit my_iterator(Value*const buffer_):m_buffer(buffer_)
        {}
     
     private:
        friend class boost::iterator_core_access;
     
        bool equal(my_iterator<Value> const&other_ ) const
        {
           return other_.m_buffer==m_buffer;
        }
     
        void increment()
        { ++m_buffer; }
     
        Value& dereference() const
        { return *m_buffer; }
     
        Value* m_buffer;
    };
     
    #include <iostream>
    #include <iterator>
    #include <algorithm>
     
    int main()
    {
       unsigned char buffer[12];
       typedef my_iterator<unsigned char> my_tab_iterator;
       my_tab_iterator begin(buffer);
       my_tab_iterator end(buffer + 12);
       for(;begin!=end;++begin)
       {
          *begin = 33;
       }
     
       std::copy(buffer,buffer+12,std::ostream_iterator<int>(std::cout, "\n"));
       return 0;
    }

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 47
    Par défaut
    Peut-être que c'est un bug de ma version de Boost ? (1.42).

    De tout manière, à force de chercher, j'ai fini par abandonner Boost pour créer mes propres itérateurs.

    Merci,

    Benjamin

    EDIT: Je vais quand même essayer avec une version plus récente.

  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
    dans 80% des cas l'origine de l'erreur est entre le clavier et la chaise. Pas dans la bibliothèque. Montre nous l'intégralité de ton itérateur et l'utilisation qui pose problème

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 47
    Par défaut
    Bonjour,

    Je reviens longtemps après pour signaler mon erreur (ça peut toujours servir). Après avoir longtemps utilisé mes itérateurs personnels, je n'ai pas voulu rester sur cet échec avec Boost (surtout qu'on a l'avantage d'avoir des itérateurs totalement standards).

    Mon erreur était très simple, dans la partie "Reference" du template de boost::iterator_facade (qui n'est pas utilisé dans le code de 3DArchi), j'utilisais une syntaxe du type "MonType" au lieu de "MonType&".

    Voilà, le problème était bien entre la chaise et le clavier. Mais le problème vient aussi du fait que la documentation de Boost.Iterator est surement la plus mauvaise que je n'ai jamais vu (bon, FFmpeg garde une grande place dans mon coeur pour ça aussi ).

    Voilà,

    Merci pour l'aide apportée .

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Citation Envoyé par benlaug Voir le message
    Mais le problème vient aussi du fait que la documentation de Boost.Iterator est surement la plus mauvaise que je n'ai jamais vu
    Tu n'as pas assez bossé avec d'autres bibliothèques de Boost.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 47
    Par défaut
    Citation Envoyé par oodini Voir le message
    Tu n'as pas assez bossé avec d'autres bibliothèques de Boost.
    En effet, d'habitude je suis plus C/Java. Le C++ c'est relativement "récent" pour moi .

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

Discussions similaires

  1. Iteration VS recursivité
    Par yacinechaouche dans le forum C
    Réponses: 40
    Dernier message: 16/11/2012, 11h52
  2. remplacement de logic:iterate par s:iterator
    Par joebarteam88 dans le forum Struts 2
    Réponses: 1
    Dernier message: 11/09/2008, 15h00
  3. Iterator dans un iterator
    Par maxf1 dans le forum Struts 2
    Réponses: 3
    Dernier message: 14/07/2008, 12h00
  4. [struts][iterate] problème logic:iterate avec un Vector
    Par jaimepasteevy dans le forum Struts 1
    Réponses: 9
    Dernier message: 31/03/2004, 18h05
  5. vInt::iterator
    Par Monstros Velu dans le forum C++
    Réponses: 19
    Dernier message: 05/04/2003, 15h06

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