templates & stl - efreidoc.frefreidoc.fr/l2 - pl2/programmation en c++/cours/20xx-xx... · 2018. 6....
TRANSCRIPT
-
Templates & STL
Ou comment ne pas réinventer la roue à chaque fois
-
Templates
Template : patron ou modèle Programma2on générique : Implanter des algorithmes ou des conteneurs sans se soucier du type (classe) sous-‐jacent
-
Templates
Exemple : comparer des objets pour avoir une comparaison de type min / max
Toujours la même méthode : opérateurs de comparaison , =, ==, !=
Possible pour toute classe ou type proposant ces opérateurs
-
Exemple :classe Date
Surcharge d'opérateurs ! class Date { long jj,mm,aa; public : date(long=1,long=1,long=2000); ~date();
bool operator(const date &); // méthode membre // autres surcharges
}; On peut écrire : Date d1, d2(3,7,2009); cout
-
Exemple :classe Date bool Date::operatoraa < uneDate.aa) { res=true; } else if (aa == uneDate.aa) { … }
return res; }
-
Fonction template
Écrire une fonc2on "paramétrée" par un type
template T mint(T a, T b) { if (a < b) { return a; } else { return b; }
}
-
Fonction template
T inconnu (c'est le but): pas de compila2on, doit être instancié par un type ð se place dans un fichier .h
Ou sépara2on prototype / défini2on // templatemin.h template mint (T a, T b); // templatemin.cpp #include "templatemin.h" template T mint(T a, T b) { return ((a
-
Fonction template : appel
Instancier le type de manière implicite ou explicite
// main.cpp #include "templatemin.h" int main(int argc, char *argv[]) { int a,b,c; a = 4; b = 7;
c = mint(a,b); // le compilateur infère le type
}
c = mint(a,b);
-
Fonction template : appel
Valable avec les classes qui surchargent < // main.cpp #include "templatemin.h" #include "Date.h" int main(int argc, char *argv[]) { Date d1(3,7,1995),d2,datemin; datemin = mint(d1,d2); // le compilateur infère le type
}
datemin = mint(d1,d2);
-
Autres aspects
Peut être surchargé : template T mint(T a, T b);
template T mint(T a, T b, T c);
Plusieurs classes "paramètres" template
{
for(…)
{
tab[i] = tab[i] + val;
}
} Nécessite simplement qu'on puisse "addi2onner" un T et un U : opérateur surchargé dans la classe T ou méthode friend
-
Classes template
Patron de classe U2lisée pour les conteneurs entre autres Conteneur : classe stockant des éléments d'une autre classe
Un tableau de… Une pile de … Une file de … Une liste chaînée de …
-
Conteneurs Présentent un comportement indépendant du type stocké
Exemple : pile : v empiler(); v dépiler(); v estPileVide();
Ces méthodes forment l'interface du conteneur => fichier .h
-
Conteneurs
Dans le fichier .cpp : implémenta2on du comportement avec des templates
Exemple : une pile représentée par un tableau (sans héritage)
Classe template : une pile de qqchose…
-
Exemple : pile // dans pile.h template class Pile { T *elements; long maxElem; long nbElem;
public : Pile(long tai):maxElem(tai),nbElem(0) { if(tai>0) { elements = new T[tai] } else { maxElem=0; elements = NULL; } }
};
Constructeur bien u2le pour une ini2alisa2on correcte du pointeur elements.
-
Exemple : pile template class Pile { T *elements; long maxElem; long nbElem;
public : ~Pile() { if (elements != NULL) { delete[] elements; } }
bool estPileVide(void) { return (nbElem == 0); }
};
-
Exemple : pile template class Pile { T *elements; long maxElem; long nbElem;
public : void empiler(T value) { if (nbElem < maxElem) { elements[nbElem++] = value; } }
T depiler(void) { if (!estPileVide()) { return (elements[--nbElem]); } else { ??? } }
};
-
Utilisation de la pile // dans main.cpp #include "pile.h" int main(int argc, char *argv[]) { Pile pipile;
pipile.empiler(3.12); cout
-
Templates avec 2 paramètres template class Pile { T elements[size]; long nbElem;
…
};
typedef Pile pile10long;
typedef Pile pile50string;
//Dans main.cpp
pile10long pipile;
pipile.empiler(42);
-
STL : Standard Template Library Bibliothèque de Templates fourni en standard avec les environnements C++
v Des conteneurs et des itérateurs
listes, vecteurs, tables de hashage, …
v Réu2liser du code éprouvé et bien écrit
v Se concentrer sur la valeur ajoutée de l'applica2on
-
STL : conteneurs v vector : tableau redimensionnable
v list : liste doublement chaînée
v set : ensemble sans doublons
v multiset : ensemble triés
v map : tableau associa2f (clé, valeur) avec un ordre
v hash_map : tableau associa2f (clé, valeur) avec accès rapide mais sans ordre
-
STL : algorithmes Exemple avec le template vector #include vector vec(4); // tableau à 4 éléments vec[0] = 1; // l'opérateur [] est surchargé vec[1] = 3; vec[2] = vec[1]+1; vec[3] = vec[2]-vec[0];
Algorithmes de manipula2on : reverse(vec.begin(), vec.end()); long tai = 17; vec.resize(tai);
Chaque conteneur dispose de ses méthodes : aide au choix du type de conteneur.
Les opérateurs classiques sont surchargés, on se concentre sur l'u2lisa2on du conteneur et non sur son organisa2on
-
STL : itérateurs Implémenta2on d'un conteneur inconnue Seul son interface est intéressante (méthodes + propriétés connues)
Généralisa2on des pointeurs pour parcourir un conteneur (une collec2on)
Des méthodes fournissent le début et la fin du conteneur, un itérateur se "déplace" entre ces limites et joue le rôle d'un pointeur sur les éléments.
Plus besoin de connaître l'organisa2on mémoire !
-
Itérateurs avec une list #include #include list _l; _l.push_front("hello"); _l.push_back("everybody"); _l.push_front("I say"); list::iterator _it; for (_it=_l.begin(); _it != _l.end(); _it++) { cout
-
Template : généralisation Méthode de recherche de valeur dans un conteneur quelconque qui propose un itérateur .
template Iter find(Iter first, Iter last, const T& value) { while (first != last) && (*first != value) { first++; } return first;
} // utilisation vector vec(12); // on l'initialise vector::iterator it =
find(vec.begin(),vec.end,Date(3,3,2003)); … list l; // on l'initialise list::iterator found = find(l.begin(),l.end(),6); cout
-
STL: classe map Recherche "map STL" :
Iterators of a map container point to elements of this value_type. Thus, for an iterator called it that points to an element of a map, its key and mapped value can be accessed respectively with: 1 map::iterator it; 2 (*it).first; // the key value (of type Key) 3 (*it).second; // the mapped value (of type T) 4 (*it); // the "element value" (of type pair)
Naturally, any other direct access operator, such as -> or [] can be used, for example: 1 it->first; // same as (*it).first (the key value) 2 it->second; // same as (*it).second (the mapped value)
-
STL: classe map Recherche "map STL" :
Iterators: begin Return iterator to beginning (public member function) end Return iterator to end (public member function) rbegin Return reverse iterator to reverse beginning (public member function) rend Return reverse iterator to reverse end (public member function) Capacity: empty Test whether container is empty (public member function) size Return container size (public member function) max_size Return maximum size (public member function) Element access: operator[] Access element (public member function) Modifiers: insert Insert element (public member function) erase Erase elements (public member function) swap Swap content (public member function) Clear Clear content (public member function)
Informa2ons disponibles sur h5p://www.cplusplus.com/reference/stl/map/