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

Slides:



Advertisements
Présentations similaires
La boucle for : init7.c et init71.c
Advertisements

Chapitre annexe. Récursivité
Cours n° 2 Les entrées-sorties Biliothèque C++ (iostream) –
Cours n° 7 Standard Template Library II.
Cours n° 6 Standard Template Library I.
C++ 6ème cours Patrick Reuter maître de conférences
Au programme du jour …. Un peu plus de structures de données
Sensibilisation à l’Algorithmique et structure de données
La classe String Attention ce n’est pas un type de base. Il s'agit d'une classe défini dans l’API Java (Dans le package java.lang) String s="aaa"; // s.
Cours n° 9 Conception et Programmation à Objets
Cours n° 8 Conception et Programmation à Objets
La programmation générique avec la STL EIUMLV - Informatique et Réseaux 99 Benoît ROMAND.
Approfondissement du langage
C.
JAV - TD 6 Structures de données JAVA
FLSI602 Génie Informatique et Réseaux
Lycée Louis Vincent SEANCE 6 Python Les listes Lundi 25 novembre 2013.
1 ARCHITECTURE DACCÈS la méthode générale modèle de données définitions module daccès / modules métiers construction des modèles les modules daccès, les.
Structures collectives en Java
Structures de données linéaires
Programmation orientée objet
Récursivité.
Les méthodes en java Une méthode est un regroupement d’instructions ayant pour but de faire un traitement bien précis. Une méthode pour être utilisée.
Mémoire périphérique Stockage primaire: Mémoire principale (RAM)
Leçon 6 : Structures de données dynamiques IUP 2 Génie Informatique Méthode et Outils pour la Programmation Françoise Greffier.
Bibliothèque standard du C++
Introduction au paradigme objet Concepts importants surcharge (overload) redéfinition (override) Définition d’une classe Définition des attributs.
Les Classes les structures en C (struct) regroupent des variables : structuration de l'analyse mais problèmes de cohérence problèmes de sécurité d'accès.
Chapitre 21 Collections Partie I Introduction Une collection : est un objet qui regroupe multiple éléments dans une unité. Une collection est.
Standard Template Library (STL)
Structures de données IFT-2000
Master 1 SIGLIS Java Lecteur Stéphane Tallard Chapitre 5 – Héritage, Interfaces et Listes génériques.
Traiter des Données avec la STL
Les fichiers binaires en C++
FICHIERS : Définition : Algorithme général:
Structures de données IFT-2000
Structures de données IFT-2000
Structures de données IFT-2000 Abder Alikacem Standard Template library Édition Septembre 2009 Département dinformatique et de génie logiciel.
Programme de baccalauréat en informatique Programmation Orientée Objets IFT Thierry EUDE Module 7 : Classes et fonctions paramétrables Département.
Conteneurs STL.
Rappels Java.
GPA789 Analyse et conception orientées objet 1 Professeur: Tony Wong, Ph.D., ing. Chapitre 6 Correspondance UML et C++
Présentation Structures de Données et TDA
Contrôle de types Les types en programmation Expressions de types Un contrôleur de types Equivalence de types Conversions de types Généricité.
Types de données abstrait et mécanismes d'encapsulation
COURS DE PROGRAMMATION ORIENTEE OBJET :
Standard Template Library
Structures de données IFT-10541
Structures de données IFT-2000 Abder Alikacem Semaine 12 (2 ième partie) Les B-arbres Département d’informatique et de génie logiciel Édition septembre.
Structures de données IFT-2000 Abder Alikacem Retour sur les listes ordonnées Département dinformatique et de génie logiciel Édition Septembre 2009.
Structures de données IFT-2000
Structures de données IFT-2000
Les fichiers texte en C++
Héritage et composition
Algorithmique Les structures Rappel L'enchaînement séquentiel
La notion de type revisitée en POO
Créer des packages.
Labo 4 : Les structures et les entrées et sorties
Méthodes de tri.
Tutorat en bio-informatique
Entrées / Sorties.
ETNA – 1ème année Guillaume Belmas –
Les surcharges d'opérateurs
C# de plus près.  Ce sont globalement les mêmes que Java : ◦ Int(int16, int32), float, double, bool,…  Les classe « communes » sont également les mêmes.
Conception de Programmes - IUT de Paris - 1ère année – Cours 8 – Les entrées/sorties Comment fonctionnent les opérateurs > pour les types élémentaires.
Cours 4 (14 octobre) Héritage. Chapitre III Héritage.
1 Listes des méthodes de la classe string, et exemples.
Transcription de la présentation:

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

Les SDDs classiques 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

Interface de code/ de données 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 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 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 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é.

Instanciation de template 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 : un opérateur de comparaison

Instanciation de template définition de fonction template : template 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 appel à cette fonction template : le compilateur détermine le type et rédige la fonction (pas de polymorphisme) template_fonc.cpp

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

Template & classes 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

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

Hiérarchie de conteneurs 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 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…

arbres Hiérarchie de conteneurs tableauliste chaînée stockage physique stockage logique pilefilehashtable collections ??

Hiérarchie de conteneurs 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 tableauliste chaînée pilefilehashtable collections ?? arbres

Hiérarchie de conteneurs 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 fonctions de base : créer, détruire, copier : constructeurs / destructeurs

Hiérarchie de conteneurs 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 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 fonctions de base : tester si le conteneur est vide / plein IsEmpty() pour tous les stockages IsFull() ??? ne devrait jamais arriver !

Hiérarchie de conteneurs 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 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 tableauliste chaînée pilefilehashtable arbres

Hiérarchie de conteneurs 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 la clef est l'indice entier et la fonction de hashage est : long hashcode(long index) { return index; }

Hiérarchie de conteneurs 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 ? attention à la prise de tête…. OUI !

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

Retour aux templates Écriture d'une classe template template 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

Classe template exemples : template class conteneur {}; template class oups {}; class et typename sont équivalents.

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

Classe template 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 ct1; cont ct2; un exemplaire par instanciation !

Classe template 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

Héritage et template 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 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 Héritage compatible avec les templates (heureusement). exemple : tablo_template.dev

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

Standard Template Library (STL) 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) 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) 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) 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…).

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

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

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

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

Fonctions de base Lire les données d'un fichier texte : ifstream infile("name.txt"); if (infile) // test de succès d'ouverture { infile >> data [>> data]; infile.close(); } else { // un message ? }

Fonctions de base La fin de fichier se teste avec la fonction eof() mais compte une ligne ou une donnée en trop ! il faut d'abord compter le nombre de lignes du fichier puis le lire. utilité d'une première ligne de fichier indiquant le nombre de lignes à lire !

Fonctions de base Sinon : utiliser la fonction getline() : bool getline(fstream &, string); renvoie true si la lecture a pu être faite, false sinon. exemple : getline.dev

Fonctions de base attention à utiliser getline() et non pas >> pour lire des lignes entières. >> a des délimiteurs de lecture, dont le caractère ' ' …

Les fichiers binaires on précise le type de fichier à lire dans le constructeur avec un paramètre supplémentaire : std::ios_base::binary et utiliser les fonctions read() et write() à vous de vous documenter !

Un exemple (presque) complet…

Conclusion Le C++, c'est super !