1 / 57

Templates, Containers et STL

Structures de données de base tableau, liste chaînée file, pile, arbres, hashtable collection, ensemble 2 caractéristiques. Templates, Containers et STL. Ne pas recoder à chaque fois

goro
Download Presentation

Templates, Containers et STL

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Structures de données de base tableau, liste chaînée file, pile, arbres, hashtable collection, ensemble 2 caractéristiques Templates, Containers et STL

  2. Ne pas recoder à chaque fois (projet archi : copier/coller de "file FIFO classique". c'était un module , en C++, une classe réutilisable) Indépendant du type/classe contenu Les SDDs classiques

  3. comportements génériques (cf polymorphisme) décrits de manière algorithmique : dans une pile d'entiers, on empile, on dépile dans une pile d'objets de classe A, on empile, on dépile même algorithme qui effectue cela ! Interface de code/ de données

  4. deux niveaux d'interface, réalisables en C++ interface de codage : bâtir une SDD sur une SDD sous-jacente : tableau et pile, liste chaînée et file, liste chaînée et hashtable par l'héritage privé. Interface de code/ de données

  5. créer une classe dont les méthodes sont indépendantes du type de contenu : un tableau de qqchose; une file de qqchose; une hashtable de clef qqchose et de valeur qqchose… Interface de code/ de données

  6. les classes dites template (template=patron, modèle) ou méta-classe (classe de classe), au sens de la composition. ne donne pas lieu à du code compilé. Interface de code/ de données

  7. 1ère étape : les fonctions templates exemple : la fonction max : indépendante du type de données à comparer à condition que ce type ou classe implémente : Instanciation de template un opérateur de comparaison < ou >

  8. définition de fonction template : template <class T>T max(T a, T b) { T res; if (a>b) // opérateur de comparaison { res = a; // opérateur = } else { res = b; } return res; } Instanciation de template

  9. appel à cette fonction template : le compilateur détermine le type et rédige la fonction (pas de polymorphisme) template_fonc.cpp Instanciation de template

  10. instanciation implicite : informations du code suffisantes : bm = ::max(ba,bb); type instancié : bouh instanciation explicite bm = ::max<bouh>(ba,bb); Instanciation de template

  11. Définir une classe container (stockage) contient : composition (ou association) rôle de cette classe : décrire un comportement générique : comment stocker des objets Template & classes

  12. niveau de stockage : physique (tableau, liste chaînée) logique (pile, file, hashtable) Hiérarchie de conteneurs où classer les arbres ? en fonction de leur interface logique

  13. D'autres types de conteneur : les collections ? (set, bag,…) choix d'après … l'interface logique = les méthodes à fournir pour accéder aux données. Hiérarchie de conteneurs

  14. On ne travaillera plus jamais avec les tableaux et les listes chaînées…en tant que SDD. coder une seule fois les classes tableau et listes pour tous les types contenus : ne change rien à [], ajout de cellule, insertion de cellule, etc… Hiérarchie de conteneurs

  15. collections pile file hashtable ? ? tableau liste chaînée Hiérarchie de conteneurs stockage logique arbres stockage physique

  16. un peu de simplification ! un arbre est un stockage logique et physique une collection ? que souhaite-t-on faire avec les stockages logiques ? Hiérarchie de conteneurs

  17. collections pile file hashtable ? ? tableau liste chaînée Hiérarchie de conteneurs arbres arbres

  18. fonctions de base : • créer, détruire, copier • ajouter un élément • récupérer un élément (en le supprimant ou non) • tester si le conteneur est vide / plein • accéder itérativement aux éléments Hiérarchie de conteneurs

  19. fonctions de base : • créer, détruire, copier : constructeurs / destructeurs Hiérarchie de conteneurs

  20. fonctions de base : • ajouter un élément : • push pour une pile • enqueue pour une file • put(key,value) pour une hashtable • add(?) pour une collection Hiérarchie de conteneurs

  21. fonctions de base : • récupérer un élément (en le supprimant ou non) • pop pour pile • dequeue pour une fille • get(key) pour une hashtable • get(?) pour une collection Hiérarchie de conteneurs

  22. fonctions de base : • tester si le conteneur est vide / plein • IsEmpty() pour tous les stockages • IsFull() ??? ne devrait jamais arriver ! Hiérarchie de conteneurs

  23. fonctions autres : • trier • insérer • selon un critère d'ordonnancement ; simple utilisation de l'opérateur =, et insérer n'intervient jamais dans les stockages logiques ! Hiérarchie de conteneurs

  24. Donc une collection est soit une pile, soit une file, soit une hashtable (à peu de choses près) car les fonctions présentées suffisent. Suffisant pour cette année, la classe collection sera développée en Java et C# Hiérarchie de conteneurs

  25. tableau liste chaînée Hiérarchie de conteneurs pile file hashtable arbres arbres

  26. Le tableau en tant que stockage logique : nous allons traiter en exemple complet la partie II du projet d'architecture : les caches cache et RAM sont des tableaux ! un tableau est une hashtable. Hiérarchie de conteneurs

  27. la clef est l'indice entier et la fonction de hashage est : long hashcode(long index) { return index; } Hiérarchie de conteneurs

  28. attention à la prise de tête…. On peut donc en déduire qu'une classe hashtable est une classe tableau pour laquelle la surcharge de l'opérateur [] fait le calcul de la clef à partir de son paramètre ? Hiérarchie de conteneurs OUI !

  29. syntaxe de cet opérateur : operator[](type paramètre); le type indique ce qui peut être écrit entre les crochets. exemple : stringindex.cpp Hiérarchie de conteneurs

  30. Écriture d'une classe template template<class/typename param> class A {//que du bon code dedans}; est la déclaration de la classe A qui est une classe template par rapport à la classe donné en paramètre Retour aux templates

  31. exemples : template<class X> class conteneur {}; template<typename TPN> class oups {}; class et typename sont équivalents. Classe template

  32. utilisation du type paramétré : dans la classe, le type (ou classe) précisé entre <> est utilisable comme un type quelconque. classe template non compilable car type non connu ! Classe template

  33. template<typename T> class oups { private : T *_val; public : oups() { _val = new T; } ~oups() { if(_val){delete _val;} } }; Rédigé dans un fichier non compilable : .h ou .tpp (attention aux extensions) Classe template

  34. Séparation interface / code, dans le même fichier, rappeler la propriété template syntaxe parfois lourde ! la prudence est de mise exemple : templatex.cpp Classe template

  35. Quand se fait la compilation de cette classe ? à l'instanciation du type paramétré : dans main() : cont<int> ct; ici, la classe paramètre X est int : on peut compiler la classe ! Classe template

  36. A noter : n'est compilé que ce qui est appelé (valable pour les classes basiques). intéressant, mais combien de classes sont compilées dans cet exemple ? cont<int> ct1; cont<int> ct2; Classe template un exemplaire par instanciation !

  37. lourd pour les classes qui sont gourmandes en fonctions ! à surveiller : la classe paramétrée doit fournir les méthodes utilisées par la classe instanciée. exemple : templatex.cpp Classe template

  38. Souvenez-vous de tablopile (héritage privé). héritage public : héritage de données et d'interface héritage privé : héritage de stockage, de support Héritage et template

  39. Idée : créer une classe conteneur tablo, qui est une classe template Instanciation : un tablo de qqchose or, une pile est un tablo (par héritage privé) mais peut-on créer une pile de qqchose qui soit un tableau de qqchose ? Héritage et template

  40. Héritage compatible avec les templates (heureusement). exemple : tablo_template.dev Héritage et template

  41. Pour être complet, une classe conteneur devrait permettre, de même qu'un tableau (tout bête) d'être : un conteneur de T donc un conteneur de toute sorte de T devrait supporter le polymorphisme Template et héritage

  42. devrait supporter le polymorphisme… la réponse à cette question par l'exemple. tablo_template.dev Template et héritage c'était donc du suspens pédagogique… le principe d'instanciation est évidemment compatible avec le polymorphisme !

  43. Ensemble de classes conteneurs et les itérateurs associés Ensemble de conteneurs déjà programmés, un itérateur est un objet dont le rôle est de parcourir ce conteneur pour accéder aux objets qui y sont stockés. Standard Template Library (STL)

  44. exemples de conteneurs : vector, set, queue, hashtable, tree, list comment choisir un conteneur : en fonction de l'efficacité pour les opérations à effectuer opposition vector / list Standard Template Library (STL)

  45. exemple d'utilisation d'un itérateur : fonctions : begin(), end() du conteneur : initialisent l'itérateur opérateur ++ : avance l'itérateur dans le conteneur opérateur * : accès à l'élément désigné par l'itérateur. exemple : tablo_iterator.dev Standard Template Library (STL)

  46. Pour le projet C++ : il vous appartient de vous documenter sur la STL et les itérateurs. (vous devrez écrire vous même une classe conteneur et un itérateur…). Standard Template Library (STL)

  47. Les fichiers en C++ Les classes ifstream et ofstream (f pour fichier) création de flots sur disque, pour les fichiers texte #include <fstream> font partie du namespace std

  48. Fichiers texte traité comme un flot d'E/S classique opérateurs << et >> classes ofstream (output : écriture) ifstream (input : lecture)

  49. Fonctions de base constructeurs : ofstream(char *); ifstream(char *); fermeture : fonction close();

  50. Fonctions de base créer un fichier texte en écriture : ofstream outfile("name.txt"); outfile << data [<< data ][<< endl]; outfile.close();

More Related