programme de baccalauréat en informatique programmation orientée objets ift-19946 thierry eude...
Post on 04-Apr-2015
125 Views
Preview:
TRANSCRIPT
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
7.1 Les classes et les fonctions paramétrables : Les modèles (Templates)
Université LavalDépartement d'informatique
7 : Classes et fonctions paramétrables
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é.
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>
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
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.
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.
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.
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.
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é
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;}
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.
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);
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>
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];};
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];}
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;}
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é.
19
Département d’informatique et de génie logiciel
Synthèse
Template•
Instanciation•
Implantation• • •
.hpp
7.2 Standard Template Library (STL)
Université LavalDépartement d'informatique
7 : Classes et fonctions paramétrisables
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++.
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.
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».
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
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.
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.
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 !
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.
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.
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.
31
Département d’informatique et de génie logiciel
Abstraction de la librairie STL
Algorithmes
Itérateurs
Conteneurs
32
Département d’informatique et de génie logiciel
Synthèse
STL =
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
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
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.
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
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
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.
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
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é.
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.
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.
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.
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).
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
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()
<-- ++
++ -->
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.
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));
49
Département d’informatique et de génie logiciel
Synthèse
Itérateurs
• Types:
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
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
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
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
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.
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.
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
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
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
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
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é.
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.
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.
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.
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...
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.
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.
67
Département d’informatique et de génie logiciel
Synthèse
Conteneurs• • • • • • • • • •
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
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
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
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.
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
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
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.
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.
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
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
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
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...
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.
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
82
Département d’informatique et de génie logiciel
Synthèse
Algorithmes• • Types
STL• +• -
top related