cours C++ 4 - templates

icon

8

pages

icon

Français

icon

Documents

Écrit par

Publié par

Le téléchargement nécessite un accès à la bibliothèque YouScribe Tout savoir sur nos offres

icon

8

pages

icon

Français

icon

Documents

Le téléchargement nécessite un accès à la bibliothèque YouScribe Tout savoir sur nos offres

Le langage C++cours TD 4IUP GMI 3 Johann Vandromme2006 - 2007 johann.vandromme@lifl.frLes templates Contrairement au Java : toutes les classes C++ nedérivent pas d'une classe commune (Object) Mécanisme permettant de faire un mêmetraitement sur des objets divers (liste d'objets – ouopérations similaires sur des types simples)class Operation Ex :{public: int addition (int a, int b) { return a+b ; } float addition (float a, float b) { return a+b ; }} ;Plan 1 - Création d ’une classe template 2 - Utilisation de template 3 - Valeurs par défaut 4 - La STL11 - Creation d'une classe template ex : la classe Operation : la définition de la classeest précédé de « template » Ensuite, on utilise le paramètre T pour désigner letype souhaitétemplate class Operation{public: T addition (T a, T b);} ;Définition du corps des méhodes La définition doit impérativement se faire au seindu header (– autre méthode ?) La définition de chaque méthode est précédée de« template » Le nom de la classe est suivi par template T Operation::addition (T a, T b){return a+b;} ;2 - Utilisation de templates Spécification du type de données traitéesOperation operationInt;int res = operationInt.addition(1,2); Remarque : le type de donnée traité par uneinstance n'est pas dynamique (dans cet exemple,on ne peut changer le type « int » en « float » pourl'instance operationInt ...
Voir icon arrow

Publié par

Nombre de lectures

49

Langue

Français

Le langage C++ cours TD 4
IUP GMI 3 2006  2007
Les templates
Johann Vandromme johann.vandromme@lifl.fr
Contrairement au Java : toutes les classes C++ ne dérivent pas d'une classe commune (Object) Mécanisme permettant de faire un même traitement sur des objets divers (liste d'objets – ou opérations similaires sur des types simples) class Operation Ex : { public:  int addition (int a, int b)  { return a+b ; }  float addition (float a, float b)  { return a+b ; } } ;
Plan
1  Création d ’une classe template 2  Utilisation de template 3  Valeurs par défaut 4  La STL
1
1  Creation d'une classe template
ex : la classe Operation : la définition de la classe est précédé de « template <class T,...> » Ensuite, on utilise le paramètre T pour désigner le type souhaité
template <class T>class Operation { public:  T addition (T a, T b); } ;
Définition du corps des méhodes La définition doit impérativement se faire au sein du header (– autre méthode ?) La définition de chaque méthode est précédée de « template <class T,...> » Le nom de la classe est suivi par <T,…>
template <class T> T Operation<T>::addition (T a, T b) { return a+b;
} ;
2  Utilisation de templates
Spécification du type de données traitées
Operation <int> operationInt; int res = operationInt.addition(1,2);
Remarque : le type de donnée traité par une instance n'est pas dynamique (dans cet exemple, on ne peut changer le type « int » en « float » pour l'instance operationInt.
2
3  Valeur par défaut On peut spécifier des valeurs par défaut à un template ou imposer un type template <class T=int, int N=10> class Tableau{ public: Tableau(); T tab[N]; } template <class T, int N> Tableau<T,N>::Tableau{ } Ici, <class T=int, ...> permettra de créer un Tableau de type entier si le type n'est pas précisée <..., int N=10> la taille du tableau sera de 10 par défaut.
4  La STL
Standard Template Library Définit des modèles de conception standards (string, list, vector, map, stack, etc.)
4.1  std::string Chaines de caractère
#include <string>
std::string s ("toto") ; std::string s2 = std::string ("titi") ; std::string *s3 = new std::string ("tata") ;
std::cout << s << std::endl ; char *s4 = s.data () ; s = "foo" ;
3
4.2  std::stack File LIFO – empilement / dépilement ajout / suppression en queue : temps constant accès uniquement au dernier élément inséré Liste (non exhaustive) des fonctionnalités : void push(const value_type&) void pop() bool empty() const value_type& top()
std::stack exemple d’utilisation
#include <stack> std::stack<int> mystack ;
for (int i = 0 ; i < 10 ; i++)  mystack.push (i) ; std::cout << mystack.size () << std::endl ; while (! mystack.empty ()) {  std::cout << mystack.top () << " " ;  mystack.pop () ; } std::cout << std::endl ;
4.3  std::list Liste doublement chainée accès : temps linéaire accès séquentiel / pas d’accès direct à un élément (Random Access) ajout / suppression : temps constant (peu importe où)
Liste (non exhaustive) des fonctionnalités :  push_front (const value_type&)  push_back(const value_type&)  Void pop_front() / void pop_back()  bool empty()  int size()  value_type& front() / value_type& back()
4
std::list utilisation #include <list> mylist1.merge (mylist2) ; std::list<std::string> mylist1 ; std::list<std::string> mylist2 ; while (! mylist1.empty ()) {  std::cout << mylist1.front () << " "; mylist1.push_front ("pomme") ; mylist1.pop_front () ; mylist1.push_front ("orange") ; } mylist1.push_front ("banane") ; mylist1.sort () ;
mylist2.push_front ("choux") ; mylist2.push_front ("tomate") ; mylist2.push_front ("poireau") ; mylist2.sort () ;
4.4  Itérateurs Disponibles sur les listes, vectors, maps, deque... (pas sur stack). Est considéré comme un pointeur sur un élément Permet le parcours des éléments Fourni par la structure de données
Itérateurs : exemple sur une liste
//ex : Affichage des éléments sans vider une liste std::list<char> mylist ;
 for (int i=0 ; i < 26 ; i++)  mylist.push_back (char (65+i)) ;
 std::list<char>::iterator iter = mylist.begin () ;  while (iter != mylist.end ())  std::cout << *iter << " " ;  iter ++
5
4.5  std::vector Tableau dynamique (réallocation automatique) accès direct à un élément random access (utilisation de [index]) insertion / suppression en queue : temps constant insertion/suppression au milieu et en tête: décalage des éléments (à éviter) Liste (non exhaustive) des fonctionnalités :  push_back(const value_type&)  pop_back(const value_type&)  Int size()  value_type& back()  [ int ]
4.6  std::deque
Mêmes particularités que std::vector MAIS insertion et suppression en tête : temps constant.
Liste (non exhaustive) des fonctionnalités :  push_back(const value_type&)  push_front(const value_type&)  Void pop_back() / void pop_front()  size()  value_type& back() / value_type& front()  [ int ]
4.7  std::map Repose sur l'utilisation de std::pair identifie un élément par une clé
std::map<std::string, std::string> mymap ;
 mymap ["fruit1"] = "pomme" ;  mymap ["fruit2"] = "poire" ;  mymap ["fruit3"] = "banane" ; Question : les tables de hachages sont elles, comme en Java, réservées aux Objets (pas aux types de base ?)
6
std::map : recherche
Utilisation d'itérateur (le membre first de l'itérateur désigne la clé et second, l'objet associé) std::map<std::string,std::string>::iterator iter = mymap.find ("fruit1") ;
if (iter != mymap.end ())  std::cout << iter > second << std::endl ;
iter = mymap.find ("fruit4") ;
if (iter != mymap.end ())  std::cout << iter > second << std::endl ;
std::map : insertion à une place donnée
Insertion avec itérateur
 iter = mymap.find ("fruit2") ;  mymap.insert (iter,  std::pair<std::string,std::string> ("fruit4", "ananas")) ;
7
8
Voir icon more
Alternate Text