La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

DUT2 – Conception et Programmation à Objets – Marie-José Caraty – 2004-2005 1 Cours n° 8 Conception et Programmation à Objets Réutilisation de composants.

Présentations similaires


Présentation au sujet: "DUT2 – Conception et Programmation à Objets – Marie-José Caraty – 2004-2005 1 Cours n° 8 Conception et Programmation à Objets Réutilisation de composants."— Transcription de la présentation:

1 DUT2 – Conception et Programmation à Objets – Marie-José Caraty – Cours n° 8 Conception et Programmation à Objets Réutilisation de composants de la bibliothèque standard du C++ (STL) 1/2 Equipe pédagogique Marie-José Caraty, Denis Poitrenaud et Mikal Ziane

2 DUT2 – Conception et Programmation à Objets – Marie-José Caraty – Introduction 1.Conteneurs 1.1.Séquences élémentaires Conteneurs vector, deque, list 1.2. Adaptateurs de séquence Conteneurs stack, queue, priority_queue 1.3. Conteneurs associatifs Conteneur map, set, multimap, multiset 2.Itérateurs 3.Algorithmes Manipulations - Ordonnancement Recherche - Ensemblistes Conclusion Sommaire

3 DUT2 – Conception et Programmation à Objets – Marie-José Caraty – STL fournit les fonctionnalités de l'algorithmique de base Ensemble de composants techniques Types abstraits de données (TAD) correspondant aux structures de données classiques (implémentation abstraite des structures de données et de leurs méthodes associées) et dalgorithmes applicables aux TAD Objectifs à la conception de STL Structures de données et algorithmes doivent fonctionner pour tout type d'élément type prédéfini/natif du langage type utilisateur (défini par le programmeur) Efficacité vitesse d'exécution Abstraction de l'implémentation Mécanisme de généricité Fondé sur les patrons (templates) de classes, de méthodes et de fonctions Normalisée en 1995 (ANSI Draft) Source et documentation disponible sur INTRODUCTION Standard Template Library (STL)

4 DUT2 – Conception et Programmation à Objets – Marie-José Caraty – Conteneurs (container) Implémentation des structures de données les plus courantes avec leur allocation/désallocation mémoire automatique Itérateurs (iterator) Principes d'accès/balayage des éléments des conteneurs Algorithmes (algorithm) Implémentation d'algorithmes génériques associés INTRODUCTION Composants phares de STL itérateur algorithme conteneur

5 DUT2 – Conception et Programmation à Objets – Marie-José Caraty – CONTENEURS Introduction Implémentation générique de structures de données classiques en programmation Organisation dun ensemble fini d'éléments de même type Conteneurs de séquence Eléments organisés suivant un arrangement linéaire Séquences élémentaires (vector, deque, list) Adaptateurs de séquence (stack, queue, priority_queue) Conteneurs associatifs Eléments décrits par des paires (clé, valeur) de type quelconque et triés par ordre de clé Recherche rapide (recherche binaire) d'élément (set, map, multiset, multimap)

6 DUT2 – Conception et Programmation à Objets – Marie-José Caraty – vector Conteneurs Adaptateurs de séquence list deque stack queue priority_queue map multimap set multiset Conteneurs de séquence Conteneurs associatifs 1. CONTENEURS Classification Séquences élémentaires

7 DUT2 – Conception et Programmation à Objets – Marie-José Caraty – Inclusion des headers standards de la librairie STL #include // Définition de la classe vector #include // Définition de la classe list #include // Définition de la classe deque #include // Définition de la classe stack #include // Définition des classes queue et priority_queue #include // Définition de la classes map #include // Définition de la classe multimap #include // Définition de la classe set #include // Définition de la classe multiset #include // Algorithmes génériques. Par exemple, copy(..) #include // Définition de la classe iterator using namespace std;// Visibilité des entités déclarées dans la librairie // standard // Sans cette clause d'utilisation : utiliser // le nom qualifié // Préfixe suivi de l'opérateur de résolution de portée // Exemple : std::vector V; 1. CONTENEURS Visibilité des composants

8 DUT2 – Conception et Programmation à Objets – Marie-José Caraty – vector deque list Blocs contigus d'objets (vector) ou non contigus (deque, list) Insertion possible en tout point de la séquence Performance fonction du type de séquence et du point d'insertion Accès direct Insertion/suppression optimisée en fin Accès direct Insertion/suppression optimisée en début ou en fin Accès séquentiel Insertion/suppression optimisée en tout point (Double End QUEue) 1.1. SEQUENCES ELEMENTAIRES Principes de fonctionnement

9 DUT2 – Conception et Programmation à Objets – Marie-José Caraty – SEQUENCES ELEMENTAIRES Méthodes communes des séquences élémentaires (1/2) Méthodes communes des séquences élémentaires (1/2) bool empty(); true si le conteneur est vide size_type size() const; Nombre d'éléments du conteneur size_type max_size() const; Contenance maximale du conteneur void resize(size_type, T c =T()); Redimensionnement du conteneur T& front(); Référence sur le premier élément T& back(); Référence sur le dernier élément

10 DUT2 – Conception et Programmation à Objets – Marie-José Caraty – void push_back(const T& ); Ajout (recopie) de l'élément en fin void pop_back(); Suppression de lélément en fin de séquence iterator insert(iterator, const T& = T()); Insertion dun élément à l'emplacement spécifié par l'itérateur void insert(iterator position, iterator debut, iterator, fin) Insertion à la position spécifiée les éléments de [debut fin[ void swap(sequence &back()) Echange des éléments de this avec ceux du conteneur argument void erase(iterator i); Suppression de l'élément pointé par l'itérateur i void erase(iterator debut, iterator fin); Supprime des éléments de [debut fin[ 1.1. SEQUENCES ELEMENTAIRES Méthodes communes des séquences élémentaires (2/2) Méthodes communes des séquences élémentaires (2/2)

11 DUT2 – Conception et Programmation à Objets – Marie-José Caraty – Définition de la classe générique vector template class vector {...}; 2 paramètres formels génériques T : type des éléments du vecteur Alloc : type de la gestion mémoire (allocation/désallocation) Remarque : Alloc a une valeur par défaut : alloc Déclaration dun vecteur : instanciation du générique Pour déclarer un objet de type vector, on instancie la classe générique vector en précisant (dans lordre et séparés par une virgule) les paramètres effectifs correspondants aux paramètres formels génériques Exemple :pour déclarer un vecteur de flottants vector vi; //sans autre paramètre, //alloc (paramètre par défaut) est considéré Notation SGI vector que nous noterons vector 1.1. SEQUENCES ELEMENTAIRES Classe générique et instanciation Classe générique et instanciation

12 DUT2 – Conception et Programmation à Objets – Marie-José Caraty – SEQUENCES ELEMENTAIRES - Conteneur VECTOR Instanciation, propriétés et méthodes spécifiques vector v; Déclaration dun vecteur v déléments de type T vector v(n); Déclaration dun vecteur v de n éléments de type T Extension de la structure classique de tableau (liste) Création et variation de la taille au cours de lexécution Fonctions dinsertion et de suppression non optimisées (sauf en fin de vecteur) Méthodes spécifiques size-type capacity() const; Capacité actuelle du conteneur void reserve(size_type); Ajout de capacité T& operator [](size_type) ou T& at(size_type); Accès direct

13 DUT2 – Conception et Programmation à Objets – Marie-José Caraty – SEQUENCES ELEMENTAIRES - Conteneur VECTOR Exemple #include using namespace std; int main() { int tabEnt[] = {10, 15, 23, 67, 43, 98, 34, 77}; vector vi; for (int i = 0; i < sizeof(tabEnt) / sizeof(int); i++) vi.push_back(tabEnt[i]); cout << "Taille : " << vi.size() << " – Vecteur : "; for (int i = 0; i < vi.size(); i++) cout << vi[i] << " "; } Résultat dexécution Taille : 8 – Vecteur :

14 DUT2 – Conception et Programmation à Objets – Marie-José Caraty – SEQUENCES ELEMENTAIRES - Conteneur DEQUE Instanciation, propriétés et méthodes spécifiques Instanciation, propriétés et méthodes spécifiques deque d; Déclaration dune deque d déléments de type T deque d(n); Déclaration dune deque d de n déléments de type T Fonctionnalités voisines de celles du conteneur vector + Insertion et suppression en début de séquence plus rapide - Accès direct plus lent Méthodes spécifiques void push_front(const T&) const; Insertion dun élément en début de séquence void pop_front(); Suppression en début de séquence T& operator [](size_type); et T& at(size_type); Accès direct

15 DUT2 – Conception et Programmation à Objets – Marie-José Caraty – SEQUENCES ELEMENTAIRES - Conteneur DEQUE Exemple Exemple #include using namespace std; int main() { int tabEnt[] = {10, 15, 23, 67, 43, 98, 34, 77}; deque di; for (int i = 0; i < sizeof(tabEnt) / sizeof(int); i++) di.push_front(tabEnt[i]); cout << "Taille : " << di.size() << " – Deque : "; for (int i = 0; i < di.size(); i++) cout << di[i] << " "; } Résultat dexécution Taille : 8 – Deque :

16 DUT2 – Conception et Programmation à Objets – Marie-José Caraty – SEQUENCES ELEMENTAIRES - Conteneur LIST Instanciation, propriétés et méthodes spécifiques (1/2) Instanciation, propriétés et méthodes spécifiques (1/2) list l; Déclaration dune liste l déléments de type T list l(n); Déclaration dune liste l de n déléments de type T Spécialisation de la structure classique de liste + Fonctions rapides dinsertion et de suppression - Accès séquentiel fonctions rapides (tri, concaténation, …) Méthodes spécifiques void push_front(const T&) const; Insertion dun élément en début de séquence void pop_front(); Suppression de lélément en début de séquence void remove(const& T valeur); Suppression de tous les éléments égaux à valeur void remove_if(Predicate pred); Suppression de tous les éléments vérifiant pred

17 DUT2 – Conception et Programmation à Objets – Marie-José Caraty – void sort([Compare cmp]); Tri des éléments selon l'opérateur < ou le foncteur cmp void reverse([Compare cmp])); Inversion de l'ordre des éléments selon l'opérateur < ou le foncteur cmp void unique([Compare cmp]); Suppression sur une liste triée des éléments en double void merge(list & x [, Compare cmp]); Fusion de la liste triée avec une autre liste x triée de même type, x est vidé. void splice(iterator i, list & x); Déplacement de la liste x dans la liste this avant lélément pointé par litérateur i void splice(iterator i, list & x, iterator j); Déplacement de lélément de x pointé par litérateur j dans la liste this avant lélément pointé par litérateur i void splice(iterator i, list & x, iterator debut, iterator fin); Déplacement de la séquence déléments [debut fin[ de x dans la liste this avant lélément pointé par litérateur i 1.1. SEQUENCES ELEMENTAIRES - Conteneur LIST Méthodes spécifiques (2/2)

18 DUT2 – Conception et Programmation à Objets – Marie-José Caraty – Variable qui repère la position d'un élément dans un conteneur Litérateur permet daccéder/balayer les éléments d'un conteneur A chaque conteneur son type ditérateur Quelque soit la classe conteneur : 2 méthodes membres Début de la collection (position du premier élément) Itérateur renvoyé par la méthode membre begin() Fin de la collection (position de l'élément "juste après le dernier") Itérateur renvoyé par la méthode membre end() Accès à lélémént repéré par litérateur It : *It Exemple : vector V; V.begin()V.end() SEQUENCES ELEMENTAIRES - Conteneur LIST Rôle des itérateurs

19 DUT2 – Conception et Programmation à Objets – Marie-José Caraty – SEQUENCES ELEMENTAIRES - Conteneur LIST Exemple Exemple #include using namespace std; int main() { int tabEnt[] = {10, 15, 23, 67, 43, 98, 34, 77, 10}; list li; for (int i = 0; i < sizeof(tabEnt) / sizeof(int); i++) li.insert(li.begin(), tabEnt[i]); li.sort(); li.unique(); cout << "Liste : "; for (list ::iterator i = li.begin(); i != li.end(); i++) cout << *i << " "; } Résultat dexécution Liste :

20 DUT2 – Conception et Programmation à Objets – Marie-José Caraty – ADAPTATEURS DE SEQUENCE Introduction Conteneurs implémentés à partir de séquences élémentaires stack Structure de données de pile - Last In First Out (LIFO) Insertions et retraits sur le haut de la pile queue Structure de données de file - First In First Out (FIFO) Insertions en fin et retraits en début priority_queue Structure de données de file avec priorité (fonction d'un prédicat) Après insertion délément, file maintenue triée par ordre croissant de priorité Insertions en fin et accès/retraits de l'élément de plus forte priorité Pas dautres accès (direct ou séquentiel) Par conséquent, pas daccès/balayage par itérateur

21 DUT2 – Conception et Programmation à Objets – Marie-José Caraty – ADAPTATEURS DE SEQUENCE – Adaptateur STACK Instanciation, propriétés et méthodes spécifiques Instanciation, propriétés et méthodes spécifiques stack > p; Déclaration dune pile p déléments de type T Sequence : séquence élémentaire (générique) Implémentation dune structure abstraite de pile Méthodes spécifiques bool empty(); true si la pile est vide, false sinon size_type size() const; Taille de la pile T& top() : Lecture du sommet de la pile (sans dépiler lélément) void push(const T& ); Empiler l'élément void pop(); Dépiler un élément

22 DUT2 – Conception et Programmation à Objets – Marie-José Caraty – ADAPTATEURS DE SEQUENCE – Adaptateur STACK Exemple Exemple #include using namespace std; int main() { float tabFlt[] = {10.2, 15.3, 23.1, 67.2, 43.4, 98.8, 34.6}; stack > pf; for (int i = 0; i < sizeof(tabFlt) / sizeof(float); i++) pf.push(tabFlt[i]); while (pf.empty() == false) { cout << pf.top() << " "; pf.pop(); } Résultat dexécution

23 DUT2 – Conception et Programmation à Objets – Marie-José Caraty – Pile implémentée par un vecteur stack > S; S.push(8); S.push(4); // assert(S.size() ==2 ); // assert(S.top() == 4); S.pop();// assert(S.top() == 8); S.pop(); // assert(S.empty()); 1.2. ADAPTATEURS DE SEQUENCE – Adaptateur STACK Exemple Exemple

24 DUT2 – Conception et Programmation à Objets – Marie-José Caraty – ADAPTATEUR DES SEQUENCES – Adaptateur QUEUE Instanciation, propriétés et méthodes spécifiques Instanciation, propriétés et méthodes spécifiques queue > f; Déclaration dune file f déléments de type T Sequence : séquence élémentaire (générique) Implémentation dune structure abstraite de file Fonctions membres bool empty(); true si la file est vide, false sinon size_type size() const; Taille de la file T& front() : Lecture de la tête de la file (sans retirer lélément) void push(const T& ); Ajout de l'élément en queue (sans retirer lélément) void pop(); Suppression dun élément en tête de file

25 DUT2 – Conception et Programmation à Objets – Marie-José Caraty – ADAPTATEUR DES SEQUENCES – Adaptateur QUEUE Exemple Exemple #include using namespace std; int main() { char tabChr[] = {'p', 'a', 'r', 'i', 's'}; queue > fa; for (int i = 0; i < sizeof(tabChr) / sizeof(char); i++) fa.push(tabChr[i]); while (fa.empty() == false) { cout << fa.front() << " "; fa.pop(); } } Résultat dexécution p a r i s

26 DUT2 – Conception et Programmation à Objets – Marie-José Caraty – File implémentée par une deque queue Q; Q.push(8); Q.push(2); // assert(Q.size() == 2); // assert(Q.back() == 2); // assert(Q.front() == 8); Q.pop(); // assert(Q.front() == 2); Q.pop(); // assert(Q.empty()); 1.2. ADAPTATEUR DES SEQUENCES – Adaptateur QUEUE Exemple Exemple

27 DUT2 – Conception et Programmation à Objets – Marie-José Caraty – ADAPTATEUR DES SEQUENCES – Adaptateur PRIORITY_QUEUE Instanciation, propriétés et méthodes spécifiques Instanciation, propriétés et méthodes spécifiques priority_queue, Compare=less > fp; Déclaration dune file à priorité fp déléments de type T Sequence : séquence élémentaire (générique) Compare : prédicat binaire générique (foncteur) de comparaison déléments Implémentation dune structure abstraite de file à priorité Méthodes spécifiques bool empty(); true si la file est vide, false sinon size_type size() const; Taille de la file T& top() : Lecture de la tête de la file (élément prioritaire) void push(const T& ); Ajout de l'élément en queue void pop(); Suppression dun élément en tête

28 DUT2 – Conception et Programmation à Objets – Marie-José Caraty – ADAPTATEUR DES SEQUENCES – Adaptateur PRIORITY_QUEUE Opérateur de comparaison Opérateur de comparaison Compare : définition du critère de priorité à partir dun prédicat binaire de comparaison bool Compare (const T& arg1, const T& arg2); paramètre générique : T, le type des éléments retourne vrai si arg1 et arg2 sont ordonnés, faux sinon 6 foncteurs prédéfinis (pour les types natifs) en C++ redéfinissant les opérateurs relationnels : equal_to retourne (arg1 == arg2) not_equal_to retourne (arg1 != arg2) greater retourne (arg1 > arg2) less retourne (arg1 < arg2) greater_equal retourne (arg1 >= arg2) less_equal retourne (arg1 <= arg2) Pour un type utilisateur T : Nécessité de redéfinir lopérateur relationnel correspondant au foncteur choisi

29 DUT2 – Conception et Programmation à Objets – Marie-José Caraty – ADAPTATEUR DES SEQUENCES – Adaptateur PRIORITY_QUEUE Exemple Exemple #include using namespace std; int main() { char tabChr[] = {'p', 'a', 'r', 'i', 's'}; priority_queue, less > fp; for (int i = 0; i < sizeof(tabChr) / sizeof(char); i++) fp.push(tabChr[i]); while (fp.empty() == false) { cout << fp.top() << " "; fp.pop(); } Résultat dexécution s r p i a

30 DUT2 – Conception et Programmation à Objets – Marie-José Caraty – Foncteur less - élément prioritaire, de plus forte priorité priority_queue P; //ordre décroissant de priorité P.push(1); P.push(8); P.push(4); // assert(P.size()==3); // assert(P.top() == 8); P.pop(); // assert(P.top() == 4); P.pop(); // assert(P.top() == 1); P.pop(); // assert(P.empty()); Foncteur greater - élément prioritaire, de plus faible priorité priority_queue > P; //ordre croissant //de priorité P.push(1); P.push(8); P.push(4);// assert(P.size()==3); // assert(P.top() == 1); P.pop(); // assert(P.top() == 4); P.pop(); // assert(P.top() == 8); P.pop(); // assert(P.empty()); 1.2. ADAPTATEUR DES SEQUENCES – Adaptateur PRIORITY_QUEUE Exemple – T est un type prédéfini Exemple – T est un type prédéfini Priorité décroissante Valeurs Priorité décroissante Valeurs

31 DUT2 – Conception et Programmation à Objets – Marie-José Caraty – Exemple : Gestion de produits par priorité de marge bénéficiaire Le produit prioritaire dans la file est celui de plus forte marge class Produit { float pV_;// prix de vente float pR_;// prix de revient // Définitions du constructeur, des accesseurs,… }; priority_queue P; // Gestion des produits par une // une file à priorité implémentée // par une deque et less Lopérateur "<" doit être redéfini pour le type Produit bool operator<(const Produit& P1, const Produit& P2) { return (P1.getPV()-P1.getPR())<(P2.getPV()-P2.getPR()) } 1.2. ADAPTATEUR DES SEQUENCES – Adaptateur PRIORITY_QUEUE Exemple – T est un type utilisateur Exemple – T est un type utilisateur


Télécharger ppt "DUT2 – Conception et Programmation à Objets – Marie-José Caraty – 2004-2005 1 Cours n° 8 Conception et Programmation à Objets Réutilisation de composants."

Présentations similaires


Annonces Google