| 12
 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
 
 |  
template <typename T> class Trie {
    friend class IteratorPrefixe;
    public:
        // Cree un trie basé sur un alphabet de nblettres, ou nblettres doit avoir une valeur comprise
        // entre 1 et NBLETTRESMAX inclusivement
        Trie(unsigned nblettres) throw(runtime_error);
        // Ajoute un élément dont la clé est donnée en premier argument et le contenu en second argument
        // Le contenu doit être défini (pointeur différent de NULL)
        // La clé doit être composée de lettres valides (soit les lettres comprises entre a inclusivement et a+nblettres exclusivement
        //      par exemple :   si nblettres vaut 3, a, b et c sont les seuls caractères autorisés;
        //                      si nblettres vaut 15, seules les lettres entre a et o inclusivement sont autorisées.
        // Renvoie true si l'insertion a pu se faire, renvoie false sinon.
        bool ajouteElement(string, T*) throw(runtime_error);
        // Supprime un élément dont la clé est donnée en argument et renvoie le contenu du noeud supprimé
        // La clé doit être composée de lettres valides (voir ci-dessus)
        // Peut egalement supprimer en meme temps des ancetres du noeud mentionne, si ces ancetres sont devenus inutiles
        // Renvoie NULL si l'élément a supprimer n'existe pas
        T* supprimeElement(string cle) throw(runtime_error);
        // Cherche un élément dont la clé est donnée en argument et renvoie le contenu associé
        // La clé doit être composée de lettres valides (voir ci-dessus)
        // Renvoie NULL si la clé n'existe pas
        T* chercheElement(string cle) throw();
        // Classe d'itérateur permettant de parcourir le trie en profondeur en mode préfixe
        class IteratorPrefixe;
        // Renvoie un itérateur pointant sur le premier élément du parcours du trie en profondeur en mode préfixe
        IteratorPrefixe pbegin() throw(runtime_error);
        // Renvoie un itérateur pointant au-delà du dernier élément du parcours du trie en profondeur en mode préfixe
        IteratorPrefixe pend() throw();
    private:
        unsigned nbLettres;
        T* element;
        vector<Trie<T> *> enfants;
        Trie<T> * parent;
        // Cette fonction supprime un noeud et ses ancêtres devenus inutiles. Elle fait essentiellement le meme travail
        // que supprimeElement : c'est la façon de désigner le noeud a supprimer qui change. De plus, contrairement a
        // supprimeElement, elle ne retourne aucune information sur le noeud supprimé.
        void supprime(Trie<T> * noeud) throw();
        // Cette fonction cherche un noeud en fonction d'une clé donnée. Elle fait essentiellement le meme travail
        // que chercheElement mais renvoie une référence au noeud trouvé (ou NULL si le noeud n'existe pas)
        // La clé doit être composée de lettres valides (voir ci-dessus)
        Trie<T>* cherche(string cle) throw(runtime_error);
};
template <typename T> class Trie<T>::IteratorPrefixe{
    friend class Trie<T>;
    public:
        IteratorPrefixe() : arbre(NULL), noeudCourant(NULL), cleCourante("") {};
        pair<string, T*> operator*() {return make_pair(cleCourante, noeudCourant -> element);} ;
        IteratorPrefixe operator++()throw(runtime_error);
        void operator=(IteratorPrefixe iter) {arbre = iter.arbre; noeudCourant = iter.noeudCourant; cleCourante = iter.cleCourante;};
        bool operator==(IteratorPrefixe iter) {return arbre == iter.arbre && noeudCourant == iter.noeudCourant;};
        bool operator!=(IteratorPrefixe iter) {return arbre != iter.arbre || noeudCourant != iter.noeudCourant;};
    private:
        Trie<T> * arbre;
        Trie<T> * noeudCourant;
        string cleCourante;
}; | 
Partager