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 :

Iterator et déréférencement


Sujet :

C++

  1. #1
    Invité
    Invité(e)
    Par défaut Iterator et déréférencement
    Bonjour,

    question:
    le code suivant ne compile pas
    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
     
    #include <set>
    #include <deque>
    int main()
    {
        std::set<std::deque<int> > s;
        std::deque<int> d,e;
        d.push_back(10);
        s.insert(d);
        std::set<std::deque<int> >::iterator it;
     
        it->insert(it->begin(), d.begin(), d.end());
        //e=*it;
        //e.insert(e.begin(), d.begin(), d.end());
        return 0;
    }
    (
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    /home/toto/workspace/c++/dummy/src/main.cpp:11:47: erreur: no matching function for call to ‘std::deque<int>::insert(std::deque<int>::const_iterator, std::deque<int>::iterator, std::deque<int>::iterator) const’
    /home/toto/workspace/c++/dummy/src/main.cpp:11:47: note: candidates are:
    /usr/include/c++/4.6/bits/deque.tcc:150:5: note: std::deque<_Tp, _Alloc>::iterator std::deque<_Tp, _Alloc>::insert(std::deque<_Tp, _Alloc>::iterator, const value_type&) [with _Tp = int, _Alloc = std::allocator<int>, std::deque<_Tp, _Alloc>::iterator = std::_Deque_iterator<int, int&, int*>, std::deque<_Tp, _Alloc>::value_type = int]
    /usr/include/c++/4.6/bits/deque.tcc:150:5: note:   candidate expects 2 arguments, 3 provided
    /usr/include/c++/4.6/bits/stl_deque.h:1491:7: note: void std::deque<_Tp, _Alloc>::insert(std::deque<_Tp, _Alloc>::iterator, std::deque<_Tp, _Alloc>::size_type, const value_type&) [with _Tp = int, _Alloc = std::allocator<int>, std::deque<_Tp, _Alloc>::iterator = std::_Deque_iterator<int, int&, int*>, std::deque<_Tp, _Alloc>::size_type = unsigned int, std::deque<_Tp, _Alloc>::value_type = int]
    /usr/include/c++/4.6/bits/stl_deque.h:1491:7: note:   no known conversion for argument 1 from ‘std::deque<int>::const_iterator {aka std::_Deque_iterator<int, const int&, const int*>}’ to ‘std::_Deque_iterator<int, int&, int*>’
    /usr/include/c++/4.6/bits/stl_deque.h:1506:9: note: template<class _InputIterator> void std::deque::insert(std::deque<_Tp, _Alloc>::iterator, _InputIterator, _InputIterator) [with _InputIterator = _InputIterator, _Tp = int, _Alloc = std::allocator<int>, std::deque<_Tp, _Alloc>::iterator = std::_Deque_iterator<int, int&, int*>]
    )

    alors que celui-ci oui
    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
    #include <set>
    #include <deque>
    int main()
    {
        std::set<std::deque<int> > s;
        std::deque<int> d,e;
        d.push_back(10);
        s.insert(d);
        std::set<std::deque<int> >::iterator it;
     
        //it->insert(it->begin()+0, d.begin(), d.end());
        e=*it;
        e.insert(e.begin(), d.begin(), d.end());
        return 0;
    }
    pourquoi alors que it-> est au même niveau que e (copié par valeur)?
    (j'utilise g++
    Target: i686-linux-gnu
    gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)
    )

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::set<std::deque<int> >::iterator it;
    Si je ne me trompe pas, un itérateur non-initialisé est un itérateur qui vaut end().

    As-tu essayé de faire : std::set<std::deque<int> >::iterator it = s.begin(); ?

  3. #3
    Invité
    Invité(e)
    Par défaut
    le problème survient à la compilation. Je m'occupe pas (encore) des segfaults.

    (et sinon oui, c'est juste qu'en simplifiant j'ai oublié l'initialisation)

  4. #4
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut


    Dans un cas ton objet est dans un std::set dans un autre cas il est à l'extérieur.

    Un itérateur de std::set ne peut être qu'en "lecture seule" (output iterator), il renvoie donc une référence constante lorsque tu utilises l'opérateur * ou ->.
    std::set est un conteneur trié, si tu pouvais modifier une valeur, tu bouleverserais tout l'ordre du std::set.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 118
    Points : 158
    Points
    158
    Par défaut
    Dans ma libstdc++, j'ai cette implémentation pour l'opérateur -> des itérateurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     typedef const _Tp* pointer;
    pointer operator->() const
    { 
        return std::__addressof(static_cast<_Link_type> (_M_node)->_M_value_field); 
    }
    donc l'appel à it->begin() correspond à la version const de begin() renvoyant un const_iterator
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const_iterator begin () const;
    Ainsi le compilo ne trouve aucune surcharge matchant avec ton typage lors de l'appel à la fonction membre insert, en effet ton typage est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::deque<int>::insert(std::deque<int>::const_iterator, std::deque<int>::iterator, std::deque<int>::iterator) const

  6. #6
    Invité
    Invité(e)
    Par défaut
    aaaah

    e.begin() retourne un iterator et -> envoie un const element et de fait un const begin!

    merci à vous

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 118
    Points : 158
    Points
    158
    Par défaut
    Heu -> renvoie un Tp const *

+ 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. Iterator bidirectional qui refuse les déréférencement ?
    Par méphistopheles dans le forum C++
    Réponses: 4
    Dernier message: 20/09/2009, 15h51
  3. [débutant][struts] iterate imbriquée
    Par muim dans le forum Struts 1
    Réponses: 6
    Dernier message: 19/02/2004, 15h13
  4. [debutant]iterator
    Par Wis dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 05/05/2003, 10h49
  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