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 :

Liste doublement chaînée et itérateurs


Sujet :

C++

  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur à ses heures perdues
    Inscrit en
    Août 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur à ses heures perdues

    Informations forums :
    Inscription : Août 2011
    Messages : 36
    Par défaut Liste doublement chaînée et itérateurs
    Bonsoir à tous,

    En plein apprentissage du c++ (sur le livre ppp de stroustrup) j'en arrive au chapitre sur les conteneurs et itérateurs. On désire créer notre propre classe pour définir une liste doublement chaînée. Voici la définition proposée :

    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
    53
    54
    55
    56
    57
    58
    59
    60
    #include <iostream>
     
    using namespace std;
     
    //------------------------------------------------------------------------------
     
    template<class Elem> struct Link {
        Link* prev;    // previous link
        Link* succ;    // successor (next) link
        Elem  val;     // the value
        Link(const Elem& v = Elem(), Link* p = 0, Link* s = 0) : val(v), prev(p), succ(s) {}
    };
     
    //------------------------------------------------------------------------------
     
    template<class Elem> class list {
        // representation and implementation details
    public:
        class iterator;     // member type: iterator
     
        list() : first(new Link<Elem>()), last(first) {}
     
        iterator begin();   // iterator to first element
        iterator end();     // iterator to one beyond last element
     
        iterator insert(iterator p, const Elem& v); // insert v into list after p
        iterator erase(iterator p);                 // remove p from the list
     
        void push_back(const Elem& v);  // insert v at end
        void push_front(const Elem& v); // insert v at front
        void pop_front();   // remove the first element
        void pop_back();    // remove the last element
     
        Elem& front();      // the first element
        Elem& back();       // the last element
     
        Link<Elem>* first;
        Link<Elem>* last;   // one-beyond-the-last link
    };
     
    //------------------------------------------------------------------------------
     
    template<class Elem> class list<Elem>::iterator {
        Link<Elem>* curr;   // current node
    public:
        iterator(Link<Elem>* p) :curr(p) { }
        iterator& operator++() {curr = curr->succ; return *this; } // forward
        iterator& operator--() {curr = curr->prev; return *this; } // backwards
        Elem& operator*() { return curr->val; } // get value (dereference)
     
        bool operator==(const iterator& a, const iterator& b)
        {
            return a.curr==b.curr;
        }
     
        bool operator!=(const iterator& a, const iterator& b)
        {
            return a.curr!=b.curr;
        }
    };
    Je voudrais savoir si template<class Elem> class list et template<class Elem> class list<Elem>::iterator sont liées (la réponse devrait être oui) et si oui, comment le sont-ils ? Pourquoi avoir surcharger les opérateurs en définissant une classe à part ?

    Merci d'avance

  2. #2
    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
    Les itérateurs (tels que spécialisés ici) permettent de se balader sur les éléments d'une liste.

    Quant aux opérateurs, il n'y a aps vraiment de surcharge : par défaut, une classe quelconque n'a pas d'opérateurs +, -, etc.

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur à ses heures perdues
    Inscrit en
    Août 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur à ses heures perdues

    Informations forums :
    Inscription : Août 2011
    Messages : 36
    Par défaut
    Merci de ta réponse.

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 21/03/2008, 22h46
  2. Réponses: 9
    Dernier message: 14/01/2007, 17h09
  3. Listes doublement chaînées
    Par nicolas66 dans le forum C++
    Réponses: 5
    Dernier message: 19/11/2005, 12h17
  4. Liste doublement chaînée
    Par garf dans le forum Langage
    Réponses: 3
    Dernier message: 27/09/2005, 09h33

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