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 :

initialisation de boost::reverse_iterator


Sujet :

Boost C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 39
    Par défaut initialisation de boost::reverse_iterator
    Bonjour,
    Sauriez-vous comment initialiser un boost::reverse_iterator ? Je n'y parviens pas, contrairement à un std::reverse_iterator (d'ailleurs je vois mal l'avantage de boost sur cette classe précise) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <boost/iterator/reverse_iterator.hpp>
    #include <vector>
     
    int main(void)
    {
    	int oh[] = { 23, 54, 30, 2 };
    	std::vector<int> vecto(oh, oh + 4);
    	boost::reverse_iterator<std::vector<int>::iterator> ito = vecto.rbegin();
    	return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ g++ -Wall j.cpp && ./a.out
    j.cpp: In function ‘int main()’:
    j.cpp:9: error: conversion from ‘std::reverse_iterator<__gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > > >’ to non-scalar type ‘boost::reverse_iterator<__gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > > >’ requested
    Le problème vient du fair que ito ne veut pas être initialisé avec vecto.rbegin() ou vecto.begin().
    Merci beaucoup !

  2. #2
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    Bonjour,
    C'est vrai que, comme d'habitude, la doc de boost est vraiment pénible.
    J'aime beaucoup l'introduction :
    reverse_iterator (PDF): an iterator which traverses the elements of some bidirectional sequence in reverse. Corrects many of the shortcomings of C++98's std::reverse_iterator.
    sauf qu'évidement la doc en elle même n'explique pas du tout quels sont ces "shortcomming" et comment boost::reverse_iterator les corrige...

    En triturant un peu j'arrive à ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int main(void)
    {
       int oh[] = { 23, 54, 30, 2 };
       std::vector<int> vecto(oh, oh + 4);
       typedef std::vector<int>::iterator base_iterator;
       boost::reverse_iterator<base_iterator> ito(vecto.end());
       boost::reverse_iterator<base_iterator> ito2(vecto.begin());
     
       std::copy(ito, ito2, std::ostream_iterator<int>(std::cout, "\n"));
       std::cout << std::endl;
     
       return 0;
    }
    Deux remarques :
    1) Un boost::reverse_iterator se construit à partir d'un iterator et pas d'un reverse_iterator
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    boost::reverse_iterator<std::vector<int>::iterator> ito = vecto.rbegin(); //erreur rbegin() renvoi un reverse_iterator.
    2) Le constructeur de boost::reverse_iterator est explicit. Il y a surement une bonne raison pour ça, mais du coup l'utilisation devient assez horipilante, car tout comme pour les shared_ptr on ne peut plus faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    boost::shared_ptr<int> sp = new int(5); // erreur
    boost::reverse_iterator<base_iterator> ito = vecto.end(); //erreur
    Il faut obligatoirement faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    boost::shared_ptr<int> sp(new int(5));
    boost::reverse_iterator<base_iterator> ito(vecto.end());

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 39
    Par défaut
    Salut,
    Merci de ta réponse, problème résolu. Les deux problèmes comme tu le dis :
    1) initialiser avec un iterator et non un reverse_iterator (contrairement à std::reverse_iterator)
    2) constructor explicit
    Etrange, car les constructors des autres iterator adaptors proposés par Boost ne semblent pas être explicit. Cela marche donc avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <boost/iterator/reverse_iterator.hpp>
    #include <vector>
     
    int main(void)
    {
    	int oh[] = { 23, 54, 30, 2 };
    	std::vector<int> vecto(oh, oh + 4);
    	boost::reverse_iterator<std::vector<int>::iterator> ito(vecto.end());
    	return 0;
    }
    Effectivement le problème c'est vraiment la documentation. La plupart du temps malgré tout, je trouve qu'elle est ok pour Boost. Mais là pour boost::iterator, on a juste le droit à deux propositions de standard, donc quelque chose d'assez technique et pointilleux, et non une documentation "normale". Je me suis arraché les cheveux, mais maintenant ça commence à rentrer
    Merci

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

Discussions similaires

  1. boost::filesystem::path ne veut pas s'initialiser !
    Par tlemcenvisit dans le forum Boost
    Réponses: 1
    Dernier message: 09/11/2008, 04h44
  2. Créer et initialiser un composant TStatusBar :help:
    Par James_ dans le forum C++Builder
    Réponses: 10
    Dernier message: 21/08/2003, 08h52
  3. [servlet] initialisation d'objets
    Par tiPouick dans le forum Servlets/JSP
    Réponses: 11
    Dernier message: 05/08/2003, 12h12
  4. Initialisation de XMLModule
    Par Sylvain Leray dans le forum XMLRAD
    Réponses: 10
    Dernier message: 01/04/2003, 10h08
  5. initialisation Directinput avec delphi
    Par Madmaxx dans le forum DirectX
    Réponses: 1
    Dernier message: 21/02/2003, 17h37

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