Programme de baccalauréat en informatique Programmation Orientée Objets IFT-19946 Thierry EUDE Module 7 : Classes et fonctions paramétrables Département.

Slides:



Advertisements
Présentations similaires
Cours n° 7 Standard Template Library II.
Advertisements

Cours n° 6 Standard Template Library I.
C++ 6ème cours Patrick Reuter maître de conférences
Cours n° 8 Conception et Programmation à Objets
JAV - TD 6 Structures de données JAVA
TD 1 IJA Introduction Objet, méthode, attribut Classe, instance
Introduction à la POO: Les classes vs les objets
Principes de programmation (suite)
JavaBeans Réalise par: EL KHADRAOUY TARIK AOUTIL SAFOWAN.
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.
77 Utilisation des classes (suite). 7-2 Objectifs A la fin de ce cours, vous serez capables de : Définir des méthodes surchargées dans une classe Fournir.
Classes abstraites et Interfaces
Standard Template Library (STL)
Structures de données IFT-2000
Langage Oriente Objet Cours 2.
Leçon 2 : Surcharge des opérateurs IUP 2 Génie Informatique Méthode et Outils pour la Programmation Françoise Greffier Université de Franche-Comté.
Structures de données IFT Abder Alikacem La classe vector Édition Septembre 2009 Département dinformatique et de génie logiciel.
Structures de données IFT-2000
Structures de données IFT Abder Alikacem Espace de nommage Département d’informatique et de génie logiciel Édition Septembre 2009.
Structures de données IFT-2000
Structures de données IFT-2000 Abder Alikacem Espace de nommage Département dinformatique et de génie logiciel Édition Septembre 2009 Département dinformatique.
Programme de baccalauréat en informatique Programmation Orientée Objets IFT Thierry EUDE Module 5 : La surcharge des opérateurs Département dinformatique.
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.
Structures de données IFT Abder Alikacem Gestion des exceptions Département dinformatique et de génie logiciel Édition Septembre 2009.
Structures de données IFT-2000
66 Utilisation des classes et des objets. 6-2 Objectifs A la fin de ce cours, vous serez capables de : Créer de nouvelles classes à laide de Eclipse Utiliser.
Conteneurs STL.
GPA789 Analyse et conception orientées objet 1 Professeur: Tony Wong, Ph.D., ing. Chapitre 6 Correspondance UML et C++
Introduction au paradigme orienté-objet (suite)
P. Van Roy, LINF1251 LINF1251: Le Langage Java Peter Van Roy Département dIngénierie Informatique, UCL
Un langage de programmation hybride
IFT 6800 Atelier en Technologies d’information
Chapitre 9 Les sous-programmes.
Types de données abstrait et mécanismes d'encapsulation
COURS DE PROGRAMMATION ORIENTEE OBJET :
1 Fonction : surcharge de sélection La surcharge de sélection consiste à implanter plusieurs méthodes de même nom dans une même classe à condition que.
Standard Template Library
C++ : fonctions et opérateurs
Leçon 1 : notion dobjet IUP Génie Informatique Besançon Méthode et Outils pour la Programmation Françoise Greffier Université de Franche-Comté.
Programme de baccalauréat en informatique Programmation Orientée Objets IFT Thierry EUDE Module 6. Gestion des erreurs et des exceptions : Fonctionnement.
Structures de données IFT-2000
Structures de données IFT-10541
99 Réutilisation du code grâce à l'héritage. 9-2 Objectifs À la fin de ce cours, vous serez capables de : Définir l'héritage Utiliser l'héritage pour.
Structures de données IFT-2000 Abder Alikacem Semaine 11 Gestion des arbres binaires de tri et de recherche. Les arbres cousus. Les arbres n-aires Département.
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
Structures de données IFT-2000
Chapitre X Modèles.
2.1 - Historique Chapitre 2 : Introduction au langage C++
Objectifs À la fin de ce cours, vous serez capables de :
La notion de type revisitée en POO
Cours 9 Exceptions (fin) Généricité. POO-L3 H. Fauconnier2 Chaînage d'exceptions  Une exception peut être causée par une autre.  il peut être utile.
La Modélisation Orientée Objet Concevoir un programme : modélisation du problème à résoudre Notion de programme : machine de Turing Pouvoir d’expression.
Programmation objet La base.
Templates, Containers et STL Structures de données de base tableau, liste chaînée file, pile, arbres, hashtable collection, ensemble 2 caractéristiques.
Cours C++ Fonctions Surcharge d’opérateurs Passage d’arguments
Tutorat en bio-informatique
Les surcharges d'opérateurs
Cours 4 (14 octobre) Héritage. Chapitre III Héritage.
pour les programmeurs en C++ Java 2 Part 1 3 Histoire de Java Projet de connexion des machines: 1991 Le nom Java a été introduit dans un café Développé.
BlueJ_III 1 Java, les objets : tout de suite ! Interaction entre objets Notes de cours associées au chapitre 3 tutorial BlueJ
Transcription de la présentation:

Programme de baccalauréat en informatique Programmation Orientée Objets IFT Thierry EUDE Module 7 : Classes et fonctions paramétrables Département dinformatique et de génie logiciel

7.1 Les classes et les fonctions paramétrables : Les modèles (Templates) Université Laval Département d'informatique 7 : Classes et fonctions paramétrables

3 Département dinformatique et de génie logiciel Définition Paramétrage des classes et des fonctions : une des caractéristiques les plus puissantes du langage C++. Les templates : permettent de spécifier dans un seul bout de code un ensemble de fonctions ou de classes surchargées (par leur type). Exemple : classe Pile définir une Pile pour chaque type de données (impossible!) on définit une classe paramétrable qui sera éventuellement instanciée pour un type donné.

4 Département dinformatique et de génie logiciel Instanciation d'une template il est possible d'utiliser une seule classe paramétrisée pour obtenir du C++ : une Pile de long, une Pile de double, une Pile de std::string, une Pile de Employe, une Pile de util::Date, etc... Exemples : Pile Pile Pile Pile Pile

5 Département dinformatique et de génie logiciel Mécanisme d'instanciation Processus pour obtenir une classe utilisable à partir d'une template : l'instanciation de la template. instanciation instanciation type spécifique création d'objets template > classe > objet Pile > Pile > m_laPileStr Pile > Pile > m_laPileReel

6 Département dinformatique et de génie logiciel Utilisation Utiliser une classe paramétrable déjà écrite par quelqu'un d'autre est très facile. Mettre simplement le type désiré en guise de paramètre de type On obtient une classe fonctionnant pour ce type. La librairie standard contient dans STL (Standard Template Library) plusieurs classes et fonctions pour usage général.

7 Département dinformatique et de génie logiciel Exigences pour l'instanciation Souvent, une classe paramétrable exigera du type un certain nombre de méthodes ou d'opérateurs... Exemples : Une Pile exigera parfois Un constructeur par défaut Un opérateur daffectation pour les types de données non primitifs.

8 Département dinformatique et de génie logiciel Implantation Exemple : la classe Pile class Pile { public: Pile (int capac = 0); bool estVide () const; bool estPleine () const; void init (); void push (const double&); double pop (); int reqCapacite () const; double top () const; private: void verifieInvariant () const; std::vector m_laPile; int m_capacite; }; classe Pile est implantée seulement pour des réels : double.

9 Département dinformatique et de génie logiciel Implantation … Remarques : la Pile n'impose rien au type contenu ne fait que les contenir la Pile est un bon candidat pour faire une classe paramétrable. Les classes et fonctions paramétrables seront utiles pour toutes les abstractions dont le comportement ne change pas en fonction du type.

10 Département dinformatique et de génie logiciel L'interface template class TPile { public: TPile (int capac = 0); bool estVide () const; bool estPleine () const; void init (); void push (const T&); T pop (); int reqCapacite () const; T top () const; private: void verifieInvariant () const; std::vector m_laPile; int m_capacite; }; Le type double devient T Ajout de cet énoncé

11 Département dinformatique et de génie logiciel Les méthodes Ajout de l'énoncé devant chaque méthode Pile devient TPile double devient T template TPile ::TPile(int capac) : m_capacite(capac) { PRECONDITION(capac >= 0); POSTCONDITION(estVide()); INVARIANTS(); } template bool TPile ::estVide() const { return m_laPile.size() == 0; } template void TPile ::push(const T& element) { PRECONDITION(!estPleine()); m_laPile.push_back(element); POSTCONDITION(!estVide()); POSTCONDITION(element == top()); INVARIANTS(); } template T TPile ::pop() { PRECONDITION(!estVide()); T top = m_laPile.back(); m_laPile.pop_back(); INVARIANTS(); return top; }

12 Département dinformatique et de génie logiciel Les méthodes : Notes supplémentaires Les méthodes ne sont plus dans un fichier.cpp mais dans le.h après la déclaration de la classe ou dans un.hpp inclut par le.h. Les méthodes inline demeurent sans changement.

13 Département dinformatique et de génie logiciel Exemple template inline T max(const T& a, const T& b) { return (a > b) ? a : b; } double x = 2.5; double y = 4.0; double z = max (x, y);

14 Département dinformatique et de génie logiciel Paramètres de la template - Multiples paramètres de type Une classe paramétrable contient souvent un seul paramètre de type : template. Parfois, une classe paramétrable peut contenir plus d'un paramètre de type : template

15 Département dinformatique et de génie logiciel - Paramètres qui ne sont pas des types Les classes paramétrées peuvent avoir des valeurs entières connues au moment de la compilation. Exemple : vecteur à dimension fixe template class VecteurFixe { public:... private: T m_elements[HI-LO+1]; };

16 Département dinformatique et de génie logiciel template class VecteurFixe { public: const T& operator[](int i) const; private: T m_elements[HI-LO+1]; }; template const T& VecteurFixe ::operator[](int i) const { PRECONDITION(LO <= i && i <= HI); return m_elements[i-LO]; }

17 Département dinformatique et de génie logiciel template std::ostream& operator<< (std::ostream& os, const std::vector & v) { os << "Dimension : " << v.size() << std::endl; for (int i=0; i<v.size(); i++) { // --- Présuppose que le type T peut s'écrire // --- dans un std::ostream. os << v[i] << std::endl; } return os; }

18 Département dinformatique et de génie logiciel Conclusion L'utilisation des templates en C++ : est incontournable offre des possibilités très intéressantes peut imposer des contraintes sur l'instanciation non documentées les tests unitaires de ces classes ou fonctions sont difficiles dû au nombre illimité de possibilités de type utilisé.

19 Département dinformatique et de génie logiciel Synthèse Template Instanciation Implantation.hpp

7.2 Standard Template Library (STL) Université Laval Département d'informatique 7 : Classes et fonctions paramétrisables

21 Département dinformatique et de génie logiciel Standard Template Library Développée chez Hewlett-Packard. Acceptée pour faire partie de la librairie standard du C++ Auteurs: Stepanov,Lee & collaborateurs Approche basé sur le développement dalgorithmes génériques. Usage intensif du mécanisme des templates du C++.

22 Département dinformatique et de génie logiciel Structures de données - Phase I Au départ, le C++ a été distribué sans aucune librairie de base. Les programmeurs de la première heure ont dû développer des classes implantant les structures de données traditionnelles: liste chaînée, vecteur, pile, file... chaînes de caractères, date... Utilisation des pointeurs void pour avoir des structures génériques.

23 Département dinformatique et de génie logiciel Structures de données - Phase II Utilisation de lapproche Smalltalk, Conteneurs classiques acceptant des «objets» et offrant certains services standardisés itérations, insertions, retraits et algorithmes. Approche obligeant le programmeur à faire hériter toutes les classes dun grand-père comme Object du Smalltalk. Ces objets doivent respecter un certain protocole pour être correctement «contenus».

24 Département dinformatique et de génie logiciel Apparition du mécanisme des templates. Plus dobligation dhéritage dun grand-père pour être éligible. On offre alors les structures de données classiques sous forme de templates. Ces classes offrent toujours différents services standards: itérations, insertions, retraits, algorithmes. Les objets doivent respecter un protocole pour être correctement «contenus». Structures de données - Phase III

25 Département dinformatique et de génie logiciel Structures de données - STL Apparition de STL. Basé sur lidée quun algorithme na pas à être lié à la structure de données utilisée. Large utilisation des templates et architecture permettant lindépendance des algorithmes face aux classes de conteneurs. Algorithmes génériques.

26 Département dinformatique et de génie logiciel y x z Types de données Conteneurs Algorithmes Le problème de la multiplicité Tâche à réaliser: implanter, - pour les types int, double, char. - pour les conteneurs : vecteur, liste chaînée, file, pile. - pour les algorithmes : recherche, tri.

27 Département dinformatique et de génie logiciel Phase I Si on na aucune structure de données, on doit développer 24 fonctions: 2 algorithmes * 4 conteneurs * 3 types de données. Si apparition dun nouveau type de données produire 8 nouvelles fonctions: 2 algorithmes * 4 conteneurs Trop coûteux !

28 Département dinformatique et de génie logiciel Lapproche STL Indépendance des algorithmes envers les conteneurs. Beaucoup dalgorithmes ne dépendent pas dune implémentation particulière dune structure de données. Propriétés fondamentales communes à plusieurs structures de données: passer dun élément à lautre du début à la fin du conteneur.

29 Département dinformatique et de génie logiciel Lapproche STL Avec STL, réduire la multiplicité du code à écrire. beaucoup de conteneurs de définis bon nombre dalgorithmes. On cesse de réécrire continuellement le même code, on fait de louvrage utile.

30 Département dinformatique et de génie logiciel Structure de la librairie STL Composantes principales de STL: Algorithmes: définir des procédures de traitement. Conteneurs: gérer un ensemble despaces mémoire selon les structures de données. Itérateurs: procurer à un algorithme une façon de traverser un conteneur.

31 Département dinformatique et de génie logiciel Abstraction de la librairie STL Algorithmes Itérateurs Conteneurs

32 Département dinformatique et de génie logiciel Synthèse STL =

33 Département dinformatique et de génie logiciel Les itérateurs Au centre de larchitecture dimplantation dalgorithmes génériques. Objet se comportant sensiblement comme un pointeur simple du langage. Sert à parcourir les éléments mis dans un conteneur. Comme un pointeur peut être NULL, un itérateur peut ne pas référer à un élément. On se sert de deux itérateurs pour spécifier un intervalle dans un conteneur. int x[10] xx+10

34 Département dinformatique et de génie logiciel Les itérateurs Comme avec les pointeurs, on considère quun intervalle spécifié ne contient jamais la borne supérieure: Ex.: [x, x+10] où x+10 désigne lendroit passé la fin de lintervalle. Les conteneurs définissent un itérateur spécial pour désigner «passé-la-fin» du conteneur. Typiquement: end() retourne un itérateur pointant à «passé-la-fin» du conteneur. begin() retourne lélément de début du conteneur. vector v begin()end() iterI

35 Département dinformatique et de génie logiciel Les itérateurs Comme avec les pointeurs sur un vecteur C++, litérateur peut être incrémenté ou décrémenté pour parcourir le conteneur ( iter++ ou iter-- ). Lorsquon spécifie un intervalle avec deux itérateurs, iter1 et iter2, il est nécessaire que iter2 soit accessible à partir de iter1, i.e. un nombre fini de iter1++ pour atteindre iter2.

36 Département dinformatique et de génie logiciel Hiérarchie des itérateurs Itérateur dentrée Lecture seulement Déplacement avant Itérateur de sortie Écriture seulement Déplacement avant Itérateur unidirectionnel avant Lecture et écriture Déplacement avant Itérateur bidirectionnel Lecture et écriture Déplacement avant et arrière Itérateur accès alléatoire Lecture et écriture Accès alléatoire

37 Département dinformatique et de génie logiciel Itérateur dentrée template InputIterator find (InputIterator debutI, InputIterator finI, const T& valeur) { while (debutI != finI && *debutI != valeur) { ++debutI; } return debutI; } Un itérateur dentrée doit respecter ces exigences: Comparaison dégalité et dinégalité: == et != Déréférence: *i Post et pré-incrément: i++ et ++i Copie: constructeur copie et opérateur dassignation

38 Département dinformatique et de génie logiciel Itérateur dentrée Exemple: int data[100];... int * where = find(data, data+100, 7); effectue la recherche dun nombre dans un vecteur C. Remarques: lintervalle en entrée est spécifié par deux itérateurs: un pointeur sur lélément du début du vecteur un pointeur sur lendroit «passé-la-fin» du vecteur. utilisation des pointeurs C traditionnels peuvent être utilisés en guise ditérateurs à accès alléatoires et donc aussi en guise ditérateurs dentrée.

39 Département dinformatique et de génie logiciel Itérateur de sortie template OutputIterator copy (InputIterator debutI, InputIterator finI, OutputIterator resultatI) { while (debutI != finI) { * resultatI++ = *debutI++; } return resultatI; } Un itérateur de sortie doit respecter ces exigences: Déréférence: *i Post et pré-incrément: i++ et ++i Copie: constructeur copie et opérateur dassignation

40 Département dinformatique et de génie logiciel Itérateur de sortie Exemple : int data[100]; vector newdata(100);... copy (data, data+100, newdata.begin()); effectue la copie des éléments contenus dans un vecteur C dans un vecteur de la librairie standard STL. Remarques : lintervalle en entrée est spécifié par deux itérateurs: un pointeur sur lélément du début du vecteur un pointeur sur lendroit «passé-la-fin» du vecteur. le vecteur en sortie est spécifié seulement par un itérateur de début mais est supposé pouvoir contenir suffisamment despace pour faire la copie, bien que ce ne soit pas vérifié.

41 Département dinformatique et de génie logiciel Itérateur unidirectionnel avant template void replace (ForwardIterator debutI, ForwardIterator finI, const T& vieilleValeur, const T& nouvelleValeur) { while (debutI != finI) { if (*debutI == vieilleValeur) { *debutI = nouvelleValeur; } ++debutI; } Un itérateur unidirectionnel avant doit respecter ces exigences: Comparaison dégalité et dinégalité: == et != Déréférence: *i Post et pré-incrément: i++ et ++i Copie: constructeur copie et opérateur dassignation Construction par défaut: obtenir un itérateur unique.

42 Département dinformatique et de génie logiciel Itérateur unidirectionnel avant Exemple : vector aVec;... replace (aVec.begin(), aVec.end(), 7, 11); remplace les éléments du vecteur égaux à 7 par 11 en procédant méthodiquement du début à la fin du vecteur. Remarques : Les itérateurs fournis par le conteneur sont utilisés comme itérateurs unidirectionnels avant (forward iterator), i.e. on lit et on écrit avec le même itérateur. les pointeurs du C auraient aussi pu être utilisés.

43 Département dinformatique et de génie logiciel Itérateur bidirectionnel template OutputIterator reverse_copy (BidirectionalIterator debutI, BidirectionalIterator finI, OutputIterator resultatI) { while (debutI != finI) { *resultatI++ = *--finI; } return resultatI; } Un itérateur bidirectionnel doit respecter ces exigences: Comparaison dégalité et dinégalité: == et != Déréférence: *i Post et pré-incrément: i++ et ++i Post et pré-décrément: i-- et --i Copie: constructeur copie et opérateur dassignation Construction par défaut: obtenir un itérateur unique.

44 Département dinformatique et de génie logiciel Itérateur bidirectionnel Exemple : list aList;.... vector aVec (aList.size()); reverse_copy (aList.begin(), aList.end(), aVec.begin() ); renverse lordre des éléments dans la liste chaînée et met le résultat dans un vecteur. Remarques : lintervalle en entrée est spécifié par deux itérateurs: un pointeur sur lélément du début de la liste un pointeur sur lendroit «passé-la-fin» de la liste. le vecteur en sortie est spécifié seulement par un itérateur de début mais est supposé pouvoir disposer de suffisamment despace pour contenir le résultat (bien que ce ne soit pas vérifié par la librairie).

45 Département dinformatique et de génie logiciel Itérateur accès aléatoire template void mixup (RandomAccessIterator debutI, RandomAccessIterator finI) { while (debutI < finI) { iter_swap(debutI, debutI + randomInteger(finI - debutI)); ++debutI; } Un itérateur à accès aléatoire doit respecter ces exigences: Opérateurs de comparaison:, >=, == et != Déréférence: *i Post et pré-incrément/décrément: i++, ++i, i--, --i Opérateurs daddition et de soustraction: +, +=, -, -= Opérateur crochet: i[n] Copie: constructeur copie et opérateur dassignation Construction par défaut: obtenir un itérateur unique

46 Département dinformatique et de génie logiciel Itérateur inverse Un itérateur impose naturellement un ordre sur les éléments à parcourir dans un contenant. Litérateur inverse nous fera parcourir les éléments dans lordre inverse. Les méthodes rbegin() et rend() des contenants retourneront des itérateurs inverses. Le premier élément de la séquence sera le dernier et le dernier sera le premier. Incrémenter un tel itérateur le fait avancer à rebours dans la séquence. vector v rend()rbegin() end()begin() < >

47 Département dinformatique et de génie logiciel Itérateurs dinsertion adaptateurs permettant de transformer un itérateur de sortie en itérateur qui insère des éléments au lieu décraser les éléments existants dans un contenant. 3 types ditérateurs dinsertion: litérateur front_inserter insère un élément au début dun contenant. litérateur back_inserter insère un élément à la fin dun contenant. litérateur inserter insère dans un contenant à lendroit désigné par litérateur passé en argument.

48 Département dinformatique et de génie logiciel Itérateurs dinsertion Exemples: vector a(10); vector b(10); list l;... // --- Écrase copy (a.begin(), a.end(), b.begin()); // --- Insère au début de la liste copy (a.begin(), a.end(), front_inserter(l)); // --- Insère à la fin de la liste copy (a.begin(), a.end(), back_inserter(l)); // --- Insère à lendroit désigné par litérateur list ::iterator sept = find(l.begin(), l.end(), 7); copy (l.begin, l.end(), inserter(l, sept));

49 Département dinformatique et de génie logiciel Synthèse Itérateurs Types:

50 Département dinformatique et de génie logiciel deque vector list set multiset map multimap stack queue priority queue Les contenants dans STL séquencesassociationsadaptateurs Les itérateurs

51 Département dinformatique et de génie logiciel bloc de mémoire contigu accès aléatoire aux éléments insertions optimisées à la fin deque vector list set multiset map multimap stack queue priority queue séquencesassociationsadaptateurs

52 Département dinformatique et de génie logiciel deque vector list set multiset map multimap stack queue priority queue séquencesassociationsadaptateurs «double end queue» prononcé «deck» bloc de mémoire contigu accès aléatoire aux éléments insertions optimisées au début ou à la fin

53 Département dinformatique et de génie logiciel liste doublement chaînée, blocs de mémoire indépendants accès séquentielle aux éléments insertions et retraits performants partout. deque vector list set multiset map multimap stack queue priority queue séquencesassociationsadaptateurs

54 Département dinformatique et de génie logiciel ensemble ordonné tous les éléments doivent être différents test dinclusion très performant insertions et retraits performants possibilité de parcourt séquentiel deque vector list set multiset map multimap stack queue priority queue séquencesassociationsadaptateurs ensemble ordonné accepte le dédoublement déléments dans la collection.

55 Département dinformatique et de génie logiciel dictionnaire associant des couples clé/définition toutes les entrées doivent être différentes test dinclusion très performant insertions et retraits performants possibilité de parcourt séquentiel deque vector list set multiset map multimap stack queue priority queue séquencesassociationsadaptateurs dictionnaire accepte le dédoublement des entrées dans la collection.

56 Département dinformatique et de génie logiciel implantation dune pile utilisant une séquence (deque par défaut) insertions et retraits performants insertions et retraits sur le dessus. deque vector list set multiset map multimap stack queue priority queue séquencesassociationsadaptateurs

57 Département dinformatique et de génie logiciel implantation dune file utilisant une list ou deque insertions et retraits performants insertions derrière et retraits devant deque vector list set multiset map multimap stack queue priority queue séquencesassociationsadaptateurs

58 Département dinformatique et de génie logiciel implantation dune file à priorité utilisant un vector ou une deque accès performants retrait de la plus grande valeur deque vector list set multiset map multimap stack queue priority queue séquencesassociationsadaptateurs

59 Département dinformatique et de génie logiciel Itérateurs et contenants Type ditérateur:Généré par: itérateur dentréeistream_iterator itérateur de sortieostream_iterator inserter front_inserter back_inserter itérateur bidirectionnellist set and multiset map and multimap itérateur accès alléatoireordinary pointers vector deque

60 Département dinformatique et de génie logiciel Comment accéder les valeurs? Si laccès aléatoire est important vector ou deque Si laccès séquentiel est suffisant un des autres conteneurs peut être adapté.

61 Département dinformatique et de génie logiciel Ordre dans la collection important? Le conteneur set maintient lordre des éléments dans la collection en tout temps. Appliquer un algorithme de tri après linsertion en utilisant un vector ou une list pour ordre à un moment donné. Si l'ordre dans la collection est lié à lordre dinsertion, un conteneur list ou un adapteur stack, queue peuvent être de bons choix.

62 Département dinformatique et de génie logiciel Dimension variable? Si les dimensions varient beaucoup, les conteneurs list ou set sont appropriés. Si les dimensions demeurent relativement fixes, les conteneurs vector et deque sont plus appropriés.

63 Département dinformatique et de génie logiciel Estimer la dimension apriori? Si on connaît la dimension quatteindra un contenant, seul le vector permet une pré-allocation dun bloc de mémoire de la bonne dimension.

64 Département dinformatique et de génie logiciel Tester la présence dun élément? Si on doit fréquemment tester la présence dun élément dans la collection, les conteneurs set ou map peuvent être de bons choix. La recherche sur ces conteneurs est très efficace alors que sur un vector par exemple, la recherche peut signifier comparer tous les éléments de la collection...

65 Département dinformatique et de génie logiciel Collection indexée ou paire/valeur? Si les clés sont un nombre entre 0 et une borne supérieure, utiliser un vector ou un deque. Dans le cas où la clé est autre chose (caractère, chaîne, type quelconque), utiliser un map.

66 Département dinformatique et de génie logiciel Position des insertions et des retraits Si les valeurs doivent être insérées et retirées dans le milieu de la collection, le conteneur list est le meilleur choix. Si les valeurs sont insérées au début, les conteneurs deque ou list sont appropriés. Si les ajouts et les retraits sont faits à la fin, le conteneur vector ou ladapteur stack peuvent être un bon choix.

67 Département dinformatique et de génie logiciel Synthèse Conteneurs

68 Département dinformatique et de génie logiciel Les algorithmes génériques Les algorithmes fournis avec STL sont découplés du conteneur sur lequel ils agissent utilisation des itérateurs. Tous les conteneurs dans la même catégorie peuvent utiliser les mêmes algorithmes. Les itérateurs Les contenants dans STL

69 Département dinformatique et de génie logiciel Exemple: count template <class InputIterator, class T> int count(InputIterator debutI, InputIterator finI, const T& valeur ) { int n=0; while(debutI != finI) if (*debut++ == valeur) n++; return n; } Paramétrisé sur le type ditérateur Paramétrisé sur le type de donnée dans le conteneur

70 Département dinformatique et de génie logiciel Exemple: count template <class InputIterator, class T> int count(InputIterator debutI, InputIterator finI, const T& valeur ) { int n=0; while(debutI != finI) if (*debut++ == valeur) n++; return n; } Définition dun intervalle à laide ditérateurs La valeur à comparer

71 Département dinformatique et de génie logiciel Exemple: count template <class InputIterator, class T> int count(InputIterator debutI, InputIterator finI, const T& valeur ) { int n=0; while(debutI != finI) if (*debutI++ == valeur) n++; return n; } Condition de sortie Note: finI doit pouvoir être atteint à partir de debutI Incrément du compteur On avance dans la collection On déréférence pour accéder lélément dans la collection.

72 Département dinformatique et de génie logiciel Utilise des InputIterator s peut donc être utilisé avec tous les conteneurs qui fonctionnent avec ceux-ci ou avec toutes les catégories plus générales ditérateurs. Exemple: count OutputIterator InputIterator ForwardIteratorBidirectionalIterator RandomAccesIterator

73 Département dinformatique et de génie logiciel Utiliser count avec une list pour compter le nombre déléments égal à 10: list l;... // --- Remplir le conteneur. int compte = 0; compte = count(l.begin(), l.end(), 10); Utiliser count avec un vector pour compter le nombre déléments égal à « a »: vector v(10);... // --- Remplir le conteneur. int compte = 0; compte = count(v.begin(), v.end(), a); Exemple: count

74 Département dinformatique et de génie logiciel Exemple: count Utiliser count avec un vecteur du C++ pour compter le nombre déléments égal à 10.5: double a[100];... // --- Remplir le vecteur int compte = 0; compte = count(a, a+100, 10.5); Lalgorithme count peut être adapté à toutes les circonstances algorithme générique.

75 Département dinformatique et de génie logiciel Algorithmes Algorithmes utilisés pour initialiser une séquence fill, fill_n, copy, copy_backward, generate, generate_n, swap_ranges. Algorithmes de recherche find, find_if, adjacent_find, search, max_element, min_element, mismatch.

76 Département dinformatique et de génie logiciel Algorithmes de transformation à même le conteneur reverse, replace, replace_if, rotate, partition, stable_partition, next_permutation, prev_permutation, inplace_merge, random_shuffle. Algorithmes de retrait remove, unique Algorithmes

77 Département dinformatique et de génie logiciel Algorithmes de génération de scalaires count, count_if, accumulate, inner_product, equal, lexicographical_compare. Algorithmes de génération de séquences transform, partial_sum, adjacent_difference Autre algorithme for_each Algorithmes

78 Département dinformatique et de génie logiciel Conclusion librairie STL : la librairie majeure intégrée au C++. na pas laissé de côté les aspects de performance. donne accès aux programmeurs à une gamme de composants performants et extensibles. Utiliser STL permet de réaliser rapidement des tâches utiles. Les itérateurs Les contenants dans STL Les algorithmes génériques

79 Département dinformatique et de génie logiciel Conclusion La librairie STL est extensible: les algorithmes existants fonctionneront sur les nouveaux conteneurs à venir. les conteneurs existants supporteront les nouveaux algorithmes écrits par lusager. de nouveaux algorithmes pourront être écrits et fonctionner sur tous les conteneurs présents et à venir...

80 Département dinformatique et de génie logiciel Limites Important : connaître et comprendre les exigences et les limites de composants de la librairie. intervalles spécifiés par deux itérateurs de source différente. itérateurs invalidés par une insertion ou un retrait dans le conteneur.

81 Département dinformatique et de génie logiciel URLs intéressantes Standard Template Library Programmer's Guide (Silicon Graphics) Site avec de nombreux liens sur dautres sites STL. Standard Template Library Site donnant accès au document officiel du standard ANSI/ISO concernant STL. Un copie de STL du domaine publique est disponible

82 Département dinformatique et de génie logiciel Synthèse Algorithmes Types STL + -