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++

Vue hybride

benlaug Boost Iterator et Writable... 30/06/2011, 22h01
Goten Si ton itérateur est mutable... 30/06/2011, 23h08
benlaug Merci pour la réponse, ... 01/07/2011, 15h56
3DArchi La vérité est ailleurs. J'ai... 02/07/2011, 07h45
benlaug Peut-être que c'est un bug de... 02/07/2011, 17h01
Message précédent Message précédent   Message suivant Message suivant
  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

+ 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