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

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

Embed Size (px)

Citation preview

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

Programme de baccalauréat en informatique Programmation Orientée Objets

IFT-19946

Thierry EUDEThierry EUDE

Module 7 : Classes et fonctions paramétrables

Département d’informatique et de génie logiciel

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

7.1 Les classes et les fonctions paramétrables : Les modèles (Templates)

Université LavalDépartement d'informatique

7 : Classes et fonctions paramétrables

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

3

Département d’informatique 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é.

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

4

Département d’informatique 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<long>Pile<double>Pile<std::string>Pile<Employe>Pile<util::Date>

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

5

Département d’informatique 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'objetstemplate ------------> classe -------------> objet

Pile<T> ---------> Pile<string> -------> m_laPileStr Pile<T> ---------> Pile<double> ------> m_laPileReel

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

6

Département d’informatique 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.

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

7

Département d’informatique 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<T> exigera parfois

• Un constructeur par défaut• Un opérateur d’affectationpour les types de données non primitifs.

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

8

Département d’informatique 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<double> m_laPile; int m_capacite;};

classe Pile est implantée seulement pour des réels : double.

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

9

Département d’informatique 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.

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

10

Département d’informatique et de génie logiciel

L'interface

template <class T>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<T> m_laPile; int m_capacite;};

Le type double devient T

Ajout de cet énoncé

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

11

Département d’informatique et de génie logiciel

Les méthodes

Ajout de l'énoncé devant chaque méthodePile devient TPile<T>double devient T

template <class T>TPile<T>::TPile(int capac): m_capacite(capac){ PRECONDITION(capac >= 0);

POSTCONDITION(estVide()); INVARIANTS();}template <class T>bool TPile<T>::estVide() const{ return m_laPile.size() == 0;}

template <class T>void TPile<T>::push(const T& element){ PRECONDITION(!estPleine());

m_laPile.push_back(element);

POSTCONDITION(!estVide()); POSTCONDITION(element == top()); INVARIANTS();}template <class T>T TPile<T>::pop(){ PRECONDITION(!estVide());

T top = m_laPile.back(); m_laPile.pop_back();

INVARIANTS(); return top;}

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

12

Département d’informatique 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.

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

13

Département d’informatique et de génie logiciel

Exemple

template<class T>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);

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

14

Département d’informatique 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 <class T>.

Parfois, une classe paramétrable peut contenir plus d'un paramètre de type :template <class C, class V>

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

15

Département d’informatique 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 T, int LO, int HI>class VecteurFixe{public: ...private: T m_elements[HI-LO+1];};

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

16

Département d’informatique et de génie logiciel

template<class T, int LO, int HI>class VecteurFixe{public: const T& operator[](int i) const;private: T m_elements[HI-LO+1];};

template<class T, int LO, int HI>const T& VecteurFixe<T, LO, HI>::operator[](int i) const{ PRECONDITION(LO <= i && i <= HI); return m_elements[i-LO];}

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

17

Département d’informatique et de génie logiciel

template<class T>std::ostream& operator<< (std::ostream& os, const std::vector<T>& 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;}

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

18

Département d’informatique 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é.

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

19

Département d’informatique et de génie logiciel

Synthèse

Template•

Instanciation•

Implantation• • •

.hpp

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

7.2 Standard Template Library (STL)

Université LavalDépartement d'informatique

7 : Classes et fonctions paramétrisables

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

21

Département d’informatique 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

d’algorithmes génériques. Usage intensif du mécanisme des templates

du C++.

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

22

Département d’informatique 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.

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

23

Département d’informatique et de génie logiciel

Structures de données - Phase II

Utilisation de l’approche 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 d’un grand-père comme Object du Smalltalk.

Ces objets doivent respecter un certain protocole pour être correctement «contenus».

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

24

Département d’informatique et de génie logiciel

Apparition du mécanisme des templates. Plus d’obligation d’héritage d’un 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

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

25

Département d’informatique et de génie logiciel

Structures de données - STL

Apparition de STL. Basé sur l’idée qu’un algorithme n’a pas à être lié à la

structure de données utilisée. Large utilisation des templates et architecture

permettant l’indépendance des algorithmes face aux classes de conteneurs.

Algorithmes génériques.

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

26

Département d’informatique et de génie logiciel

y

xz

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.

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

27

Département d’informatique et de génie logiciel

Phase I

Si on n’a aucune structure de données, on doit développer 24 fonctions:

• 2 algorithmes *• 4 conteneurs * • 3 types de données.

Si apparition d’un nouveau type de données produire 8 nouvelles fonctions:

• 2 algorithmes * 4 conteneurs

Trop coûteux !

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

28

Département d’informatique et de génie logiciel

L’approche STL

Indépendance des algorithmes envers les conteneurs. Beaucoup d’algorithmes ne dépendent pas d’une

implémentation particulière d’une structure de données. Propriétés fondamentales communes à plusieurs

structures de données: • passer d’un élément à l’autre du début à la fin du conteneur.

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

29

Département d’informatique et de génie logiciel

L’approche STL

Avec STL, • réduire la multiplicité du code à écrire. • beaucoup de conteneurs de définis • bon nombre d’algorithmes.

On cesse de réécrire continuellement le même code, on fait de l’ouvrage utile.

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

30

Département d’informatique 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 d’espaces mémoire selon les structures de données.

Itérateurs: procurer à un algorithme une façon de traverser un conteneur.

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

31

Département d’informatique et de génie logiciel

Abstraction de la librairie STL

Algorithmes

Itérateurs

Conteneurs

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

32

Département d’informatique et de génie logiciel

Synthèse

STL =

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

33

Département d’informatique et de génie logiciel

• Les itérateurs

Au centre de l’architecture d’implantation d’algorithmes 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]

x x+10

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

34

Département d’informatique et de génie logiciel

Les itérateurs

Comme avec les pointeurs, on considère qu’un intervalle spécifié ne contient jamais la borne supérieure: Ex.: [x, x+10] où x+10 désigne l’endroit passé la fin de l’intervalle.

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<int> v

begin() end()

iterI

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

35

Département d’informatique et de génie logiciel

Les itérateurs

Comme avec les pointeurs sur un vecteur C++, l’itérateur peut être incrémenté ou décrémenté pour parcourir le conteneur (iter++ ou iter--).

Lorsqu’on 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.

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

36

Département d’informatique et de génie logiciel

Hiérarchie des itérateurs

Itérateur d’entréeLecture seulementDéplacement avant

Itérateur de sortieÉcriture seulementDéplacement avant

Itérateur unidirectionnel avantLecture et écritureDéplacement avant

Itérateur bidirectionnelLecture et écriture

Déplacement avant et arrière

Itérateur accès alléatoireLecture et écritureAccès alléatoire

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

37

Département d’informatique et de génie logiciel

Itérateur d’entrée

template <class InputIterator, class T>InputIterator find (InputIterator debutI, InputIterator finI, const T& valeur){ while (debutI != finI && *debutI != valeur) { ++debutI; } return debutI;}Un itérateur d’entrée doit respecter ces exigences:Comparaison d’égalité et d’inégalité: == et !=Déréférence: *iPost et pré-incrément: i++ et ++iCopie: constructeur copie et opérateur d’assignation

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

38

Département d’informatique et de génie logiciel

Itérateur d’entrée

• Exemple:

int data[100];...int * where = find(data, data+100, 7);

effectue la recherche d’un nombre dans un vecteur C.

• Remarques:

• l’intervalle en entrée est spécifié par deux itérateurs:

un pointeur sur l’élément du début du vecteur

un pointeur sur l’endroit «passé-la-fin» du vecteur.

• utilisation des pointeurs C traditionnels

• peuvent être utilisés en guise d’itérateurs à accès alléatoires et donc aussi en guise d’itérateurs d’entrée.

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

39

Département d’informatique et de génie logiciel

Itérateur de sortie

template <class InputIterator, class OutputIterator>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: *iPost et pré-incrément: i++ et ++iCopie: constructeur copie et opérateur d’assignation

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

40

Département d’informatique et de génie logiciel

Itérateur de sortie

Exemple :

int data[100];vector<int> 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 :• l’intervalle en entrée est spécifié par deux itérateurs:

un pointeur sur l’élément du début du vecteur

un pointeur sur l’endroit «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 d’espace pour faire la copie, bien que ce ne soit pas vérifié.

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

41

Département d’informatique et de génie logiciel

Itérateur unidirectionnel avant

template <class ForwardIterator, class T>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 d’inégalité: == et !=Déréférence: *iPost et pré-incrément: i++ et ++iCopie: constructeur copie et opérateur d’assignationConstruction par défaut: obtenir un itérateur unique.

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

42

Département d’informatique et de génie logiciel

Itérateur unidirectionnel avant

Exemple :

vector<int> 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.

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

43

Département d’informatique et de génie logiciel

Itérateur bidirectionnel

template <class BidirectionalIterator, class OutputIterator>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 d’inégalité: == et !=Déréférence: *iPost et pré-incrément: i++ et ++iPost et pré-décrément: i-- et --iCopie: constructeur copie et opérateur d’assignationConstruction par défaut: obtenir un itérateur unique.

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

44

Département d’informatique et de génie logiciel

Itérateur bidirectionnel

• Exemple :

list<int> aList;....vector<int> aVec (aList.size());reverse_copy (aList.begin(), aList.end(), aVec.begin() );

renverse l’ordre des éléments dans la liste chaînée et met le résultat dans un vecteur.

• Remarques :• l’intervalle 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 l’endroit «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 d’espace pour contenir le résultat (bien que ce ne soit pas vérifié par la librairie).

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

45

Département d’informatique et de génie logiciel

Itérateur accès aléatoire

template <class RandomAccessIterator>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 d’addition et de soustraction: +, +=, -, -=• Opérateur crochet: i[n]• Copie: constructeur copie et opérateur d’assignation• Construction par défaut: obtenir un itérateur unique

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

46

Département d’informatique et de génie logiciel

Itérateur inverse

Un itérateur impose naturellement un ordre sur les éléments à parcourir dans un contenant. L’itérateur inverse nous fera parcourir les éléments dans l’ordre 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<int> v

rend() rbegin()

end()begin()

<-- ++

++ -->

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

47

Département d’informatique et de génie logiciel

Itérateurs d’insertion

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 d’itérateurs d’insertion:• l’itérateur front_inserter

insère un élément au début d’un contenant.

• l’itérateur back_inserterinsère un élément à la fin d’un contenant.

• l’itérateur inserterinsère dans un contenant à l’endroit désigné par l’itérateur

passé en argument.

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

48

Département d’informatique et de génie logiciel

Itérateurs d’insertion

Exemples:

vector<int> a(10);vector<int> b(10);list<int> l;...// --- Écrasecopy (a.begin(), a.end(), b.begin());

// --- Insère au début de la listecopy (a.begin(), a.end(), front_inserter(l));

// --- Insère à la fin de la listecopy (a.begin(), a.end(), back_inserter(l));

// --- Insère à l’endroit désigné par l’itérateurlist<int>::iterator sept = find(l.begin(), l.end(), 7);copy (l.begin, l.end(), inserter(l, sept));

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

49

Département d’informatique et de génie logiciel

Synthèse

Itérateurs

• Types:

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

50

Département d’informatique et de génie logiciel

deque

vector

list

set

multiset

map

multimap

stack

queue

priority queue

• Les contenants dans STL

séquences associations adaptateurs

• Les itérateurs

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

51

Département d’informatique et de génie logiciel

bloc de mémoire contiguaccès aléatoire aux élémentsinsertions optimisées à la fin

deque

vector

list

set

multiset

map

multimap

stack

queue

priority queue

séquences associations adaptateurs

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

52

Département d’informatique et de génie logiciel

deque

vector

list

set

multiset

map

multimap

stack

queue

priority queue

séquences associations adaptateurs

«double end queue» prononcé «deck»bloc de mémoire contiguaccès aléatoire aux élémentsinsertions optimisées au début ou à la fin

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

53

Département d’informatique et de génie logiciel

liste doublement chaînée, blocs de mémoire indépendantsaccès séquentielle aux élémentsinsertions et retraits performants partout.

deque

vector

list

set

multiset

map

multimap

stack

queue

priority queue

séquences associations adaptateurs

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

54

Département d’informatique et de génie logiciel

ensemble ordonnétous les éléments doivent être différentstest d’inclusion très performantinsertions et retraits performantspossibilité de parcourt séquentiel

deque

vector

list

set

multiset

map

multimap

stack

queue

priority queue

séquences associations adaptateurs

ensemble ordonnéaccepte le dédoublementd’éléments dans la collection.

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

55

Département d’informatique et de génie logiciel

dictionnaire associant des couples clé/définitiontoutes les entrées doivent être différentestest d’inclusion très performantinsertions et retraits performantspossibilité de parcourt séquentiel

deque

vector

list

set

multiset

map

multimap

stack

queue

priority queue

séquences associations adaptateurs

dictionnaireaccepte le dédoublementdes entrées dans la collection.

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

56

Département d’informatique et de génie logiciel

implantation d’une pile utilisant une séquence (deque par défaut)insertions et retraits performantsinsertions et retraits sur le dessus.

deque

vector

list

set

multiset

map

multimap

stack

queue

priority queue

séquences associations adaptateurs

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

57

Département d’informatique et de génie logiciel

implantation d’une file utilisant une list ou dequeinsertions et retraits performantsinsertions derrière et retraits devant

deque

vector

list

set

multiset

map

multimap

stack

queue

priority queue

séquences associations adaptateurs

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

58

Département d’informatique et de génie logiciel

implantation d’une file à priorité utilisantun vector ou une dequeaccès performantsretrait de la plus grande valeur

deque

vector

list

set

multiset

map

multimap

stack

queue

priority queue

séquences associations adaptateurs

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

59

Département d’informatique et de génie logiciel

Itérateurs et contenants

Type d’itérateur: Généré par:itérateur d’entrée istream_iteratoritérateur de sortie ostream_iterator

inserterfront_inserterback_inserter

itérateur bidirectionnel listset and multisetmap and multimap

itérateur accès alléatoire ordinary pointersvectordeque

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

60

Département d’informatique et de génie logiciel

Comment accéder les valeurs?

Si l’accès aléatoire est important vector ou deque

Si l’accès séquentiel est suffisantun des autres conteneurs peut être adapté.

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

61

Département d’informatique et de génie logiciel

Ordre dans la collection important?

Le conteneur set maintient l’ordre des éléments dans la collection en tout temps.

Appliquer un algorithme de tri après l’insertion en utilisant un vector ou une list pour ordre à un moment donné.

Si l'ordre dans la collection est lié à l’ordre d’insertion, un conteneur list ou un adapteur stack, queue peuvent

être de bons choix.

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

62

Département d’informatique 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.

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

63

Département d’informatique et de génie logiciel

Estimer la dimension apriori?

Si on connaît la dimension qu’atteindra un contenant,

seul le vector permet une pré-allocation d’un bloc de mémoire de la bonne dimension.

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

64

Département d’informatique et de génie logiciel

Tester la présence d’un élément?

Si on doit fréquemment tester la présence d’un é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...

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

65

Département d’informatique 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.

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

66

Département d’informatique 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 l’adapteur stack peuvent être un bon choix.

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

67

Département d’informatique et de génie logiciel

Synthèse

Conteneurs• • • • • • • • • •

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

68

Département d’informatique 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

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

69

Département d’informatique 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é surle type d’itérateur

Paramétrisé surle type de donnéedans le conteneur

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

70

Département d’informatique 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 d’unintervalle à l’aided’itérateurs

La valeur àcomparer

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

71

Département d’informatique 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 sortieNote: finI doit pouvoir êtreatteint à 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.

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

72

Département d’informatique et de génie logiciel

Utilise des InputIteratorspeut donc être utilisé avec tous les

conteneurs qui fonctionnent avec ceux-ci ou avec toutes les catégories plus générales d’itérateurs.

Exemple: count

OutputIterator InputIterator

ForwardIterator

BidirectionalIterator

RandomAccesIterator

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

73

Département d’informatique et de génie logiciel

Utiliser count avec une list pour compter le nombre d’éléments égal à 10:list<int> 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<char> v(10);... // --- Remplir le conteneur.int compte = 0; compte = count(v.begin(), v.end(), ‘a’);

Exemple: count

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

74

Département d’informatique 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);

L’algorithme count peut être adapté à toutes les circonstances algorithme générique.

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

75

Département d’informatique 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.

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

76

Département d’informatique 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

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

77

Département d’informatique 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

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

78

Département d’informatique et de génie logiciel

• Conclusion

librairie STL : la librairie majeure intégrée au C++. n’a 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

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

79

Département d’informatique 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 l’usager.• de nouveaux algorithmes pourront être écrits et

fonctionner sur tous les conteneurs présents et à venir...

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

80

Département d’informatique 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.

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

81

Département d’informatique et de génie logiciel

URLs intéressantes

Standard Template Library Programmer's Guide (Silicon Graphics)http://www.sgi.com/tech/stl/

• Site avec de nombreux liens sur d’autres sites STL.

Standard Template Libraryhttp://www.cs.rpi.edu/~musser/stl-book/cppstandard.html

• Site donnant accès au document officiel du standard ANSI/ISO concernant STL.

Un copie de STL du domaine publique est disponiblehttp://www.sgi.com/tech/stl/download.html

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

82

Département d’informatique et de génie logiciel

Synthèse

Algorithmes• • Types

STL• +• -