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