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

Cours n° 9 Conception et Programmation à Objets

Présentations similaires


Présentation au sujet: "Cours n° 9 Conception et Programmation à Objets"— Transcription de la présentation:

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

2 Sommaire Introduction 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 Itérateurs Algorithmes Manipulations - Ordonnancement Recherche - Ensemblistes Conclusion

3 1.3. CONTENEURS ASSOCIATIFS
Introduction Conteneurs indexés par une clé de type quelconque et triés suivant cette clé (généralisation des séquences) Concept de paire (clé, valeur) pour représenter un élément set Clé et valeur sont confondues, éléments tous distincts map Clé et valeur sont distinctes, clé unique par élément multiset Plusieurs occurrences possibles du même élément multimap Une même clé peut correspondre à plusieurs éléments

4 Méthodes communes des conteneurs associatifs (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 size_type count(const key_T& k) const; Nombre d’éléments de clé k iterator lower_bound(const key_T& k) const; Itérateur sur le 1er élément dont la clé est supérieure ou égale à k iterator upper_bound(const key_T& k) const; Itérateur sur le 1er élément dont la clé est inférieure ou égale à k

5 Méthodes communes des conteneurs associatifs (2/2)
iterator find(const key_T& k); Recherche d’un élément de clé k key_compare key_comp() const; Objet de type fonction binaire de comparaison de deux clés value_compare value_comp() const; Objet de type fonction binaire de comparaison de deux valeurs void erase(iterator i); Suppression de l’élément référencé par l'itérateur i void erase(iterator debut, iterator fin); Suppression des valeurs de [debut fin[ void erase(const key_T& k); Suppression des valeurs de clé k

6 Membres publics et fonction générique (externe) make_pair
1.3. CONTENEURS ASSOCIATIFS Patron (template) de la classe pair pair <T1, T2> T1 : type du premier élément stocké dans la paire T2 : type du deuxième élément stocké dans la paire Membres publics et fonction générique (externe) make_pair first membre correspondant au premier élément stocké second membre correspondant au deuxième élément stocké pair <T1, T2> make_pair (const T1& o1, const T2& o2); constitue un objet unique de type pair à partir de o1 et o2 Exemple : type pair sur le concept (clé, valeur) décrivant un objet voiture Pair<string, string> v; v = make_pair("Peugeot", "207 CC Coupé Cabriolet"); Cout << "Marque :" << v.first << " Modèle :" v.second << endl; clé (marque) valeur (modèle) voiture

7 map<key_T, value_T , Compare=less<key_T> > m;
1.3. CONTENEURS ASSOCIATIFS - Conteneur MAP Instanciation, propriétés et méthodes spécifiques map<key_T, value_T , Compare=less<key_T> > m; Déclaration d’un ensemble m de couples (clés de type key_T, valeurs associées de type value_T) pair make_pair(const key_T& k, const value_T& v) Regroupement de la clé et de la valeur dans un seul élément Insertion réussie si absence d’élément de même clé Méthods spécifiques pair<iterator, bool> insert(const T& e); Tentative d’insertion d’un élément e pair<iterator, bool> insert(iterator i, const T& e); Tentative d’insertion d’un élément e à l'emplacement spécifié par l'itérateur i (améloration du temps de recherche de l’emplacement) void insert(iterator debut, iterator, fin) Tentative d’insertion des éléments de [debut fin[ d’une autre séquence

8 #include <iostream> #include <map> #include <string>
1.3. CONTENEURS ASSOCIATIFS - Conteneur MAP Exemple #include <iostream> #include <map> #include <string> using namespace std; int main() { map<string, float, less<string> > prixFruit; prixFruit.insert(make_pair("poire", 1.5)); prixFruit.insert(make_pair("pêche", 2.7)); prixFruit.insert(make_pair("orange", 1.2)); map<string, float, less<string> >::iterator it; if ((it = prixFruit.find("poire")) == prixFruit.end()) cout << "fruit non référencé"; else cout << it->second; } Résultat d’exécution : 1.5

9 set<key_T, Compare=less<key_T> > s;
1.3. CONTENEURS ASSOCIATIFS - Conteneur SET Instanciation et propriétés set<key_T, Compare=less<key_T> > s; Déclaration d’un ensemble s de clés de type key_T Mêmes méthodes que pour le conteneur map Clés et valeurs confondues

10 multimap<key_T, value_T , Compare=less<key_T> > mm;
1.3. CONTENEURS ASSOCIATIFS - Conteneur MULTIMAP Instanciation, propriétés et méthodes spécifiques multimap<key_T, value_T , Compare=less<key_T> > mm; Déclaration d’un ensemble mm de couples (clés de type key_T, valeurs associées de type value_T) Pas d’échec d’insertion Méthodes spécifiques iterator lower_bound(const T& e); Recherche du premier élément de clé k iterator upper_bound(const T& e); Recherche du dernier élément de clé k

11 #include <iostream> #include <map> #include <string>
1.3. CONTENEURS ASSOCIATIFS - Conteneur MULTIMAP Exemple #include <iostream> #include <map> #include <string> using namespace std; int main() { multimap<int, string, less<int> > conjug; conjug.insert(make_pair(1, "parler")); conjug.insert(make_pair(2, "choisir")); conjug.insert(make_pair(3, "prendre")); conjug.insert(make_pair(2, "finir")); conjug.insert(make_pair(1, "manger")); multimap<int, string, less<int> >::iterator it1, it2, it; it1 = conjug.lower_bound(2); it2 = conjug.upper_bound(2); cout << "Verbes du deuxième groupe : "; for (it = it1; it != it2; it++) cout << it->second << ", "; } Résultat d’exécution : Verbes du deuxième groupe : choisir, finir

12 multiset<key_T, Compare=less<key_T> > ms;
1.3. CONTENEURS ASSOCIATIFS - Conteneur MULTISET Instanciation et propriétés multiset<key_T, Compare=less<key_T> > ms; Déclaration d’un ensemble ms de clés de type key_ T Mêmes opérations que pour le conteneur multimap Clés et valeurs confondues

13 Variable qui repère la position d'un élément dans un conteneur
2. ITERATEURS Rôles des itérateurs Variable qui repère la position d'un élément dans un conteneur Utilisés pour accéder/balayer les éléments d'un conteneur Accès (lecture/écriture) des éléments du conteneur Balayage séquentiel de tous les éléments du conteneur Méthodes membres des conteneurs (sauf adaptateurs) begin(), end() // Balayage du début du conteneur à sa fin rbegin(), rend() // Balayage de la fin du conteneur à son début

14 Généralisation et amélioration de la sûreté des pointeurs
2. ITERATEURS Opérateurs associés Généralisation et amélioration de la sûreté des pointeurs Soit l’itérateur It Déréférencement Accès au conteneur dont l'itérateur pointe l'élément *It Déplacement En avant, en arrière ou aléatoire Exemples : ++It; It++; // balayage séquentiel avant --It; It--; // balayage séquentiel arrière It+=5; It-=3; // accès direct

15 BidirectionalIterator RandomAccessIterator
2. ITERATEURS Hiérarchie des itérateurs *, i++, ++i Constructeur copie Opérateur d'assignation ==, != InputIterator OutputIterator Itérateur d'entrée Lecture Déplacement avant *, i++, ++i Constructeur copie Opérateur d'assignation Itérateur de sortie Ecriture Déplacement avant Itérateur unidirectionnel Lecture et écriture Déplacement avant ForwardIterator Itérateur bidirectionnel Lecture et écriture Déplacement avant/arrière i--, --i BidirectionalIterator <, <=, >, >= +, +=, -, -= [] Itérateur accès aléatoire Lecture et écriture Accès aléatoire RandomAccessIterator

16 A chaque conteneur son type d'itérateur
2. ITERATEURS Déclaration des itérateurs A chaque conteneur son type d'itérateur Itérateur à accès aléatoire (vector et deque) Itérateur bidirectionnel (list, map, set) Types membres des classes conteneurs const_iterator (version constante) iterator (version non constante) Déclaration d’itérateur Instanciation du conteneur, opérateur de visibilité, type d’itérateur Exemples de déclaration : Déclaration d'un itérateur Itv sur un vecteur d'entiers vector<int>::iterator Itv; Déclaration d'un itérateur Itl sur une liste d'entiers list<int>::iterator Itl;

17 Affichage d'un conteneur vecteur d'entiers par balayage d'itérateur
2. ITERATEURS Balayage/accès par itérateur Affichage d'un conteneur vecteur d'entiers par balayage d'itérateur typedef vector<int> vectInt; vectInt V; // Première version for (vectInt::iterator It=V.begin(); It<V.end(); It++) cout<<*It<<" "; // ou V[It] cout<<endl; // Deuxième version vectInt::iterator It=V.begin(); while (It!=V.end()){ cout<<*It<<" "; ++It; }

18 Manipulations Classification Algorithmes Ordonnancement Ensemblistes
Comparaisons Recherche Copie Echange Inclusion Motif Remplissage Différence Elément Remplacement Tri Intersection Réorganisation Gestion de tas Union et fusion Transformation Recherche binaire Partitionnement

19 Manipulation (Extraits)
3. ALGORITHMES Manipulation (Extraits) OutputIterator copy(InputIterator first, InputIterator last, OutputIterator result); Copie de la séquence [first last[ à l’emplacement result OutputIterator copy_backward(InputIterator first, InputIterator last, OutputIterator result); Copie de la séquence ]last first] à l’emplacement result ForwardIterator2 swap_ranges (ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2); Echange des éléments des deux séquences [first1 last1[ et [first2 last2[ void generate(ForwardIterator first, ForwardIterator last, Generator gen); Initialisation de [first last[ par une fonction génératrice void rotate (ForwardIterator first, ForwardIterator middle, ForwardIterator last); Echange des éléments des deux séquences [first middle[ et [middle last[

20 Tri de la séquence [first last[ avec l’opérateur de comparaison Comp
3. ALGORITHMES Tris (Extraits) void sort (RandomAccessIterator first, RandomAccessIterator last [,Compare comp]); Tri de la séquence [first last[ avec l’opérateur de comparaison Comp void stable_sort (RandomAccessIterator first, RandomAccessIterator last [,Compare comp]); Tri stable de la séquence [first last[ avec l’opérateur de comparaison Comp, Ordre initial en cas d’égalité

21 Recherches (Extraits)
3. ALGORITHMES Recherches (Extraits) InputIterator find(InputIterator first, InputIterator last, const T& v); Recherche de la valeur v dans la séquence [first last[ InputIterator find_if(InputIterator first, InputIterator last, Predicate pred); Recherche d’une valeur de la séquence [first last[ satisfaisant pred ForwardIterator1 find_first_of (ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, ForwardIterator2 last2); Recherche d’une valeur de la séquence [first2 last2[ présente dans la séquence [first1 last1[ ForwardIterator1 search (ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, ForwardIterator2 last2 [, BinaryPredicate binary_pred]); Recherche de la séquence [first2 last2[ dans la séquence [first1 last1[

22 Prérequis : l'opérateur == est défini pour T
3. ALGORITHMES Opération de recherches find Prérequis : l'opérateur == est défini pour T template <class InputIterator, class T> InputIterator find(InputIterator debut, InputIterator fin, const T& valeur); Recherche dans la séquence définie par l'intervalle [debut fin[ d'un item égal à valeur Retourne le premier itérateur i dans l'intervalle tel que *i == valeur Retourne end() si la valeur n'est pas trouvée

23 Prérequis : un prédicat pred est défini
3. ALGORITHMES Opération de recherche find_if Prérequis : un prédicat pred est défini template <class InputIterator, class Predicate> InputIterator find_if(InputIterator debut, InputIterator fin, Predicate pred); Recherche dans la séquence définie par l'intervalle [debut fin[ d'un item égal à valeur Retourne le premier itérateur i dans l'intervalle tel que pred(*i) ==true Retourne end() si le prédicat n'est pas satisfait

24 Résultat d'exécution : 4 (premier élément du conteneur >3)
3. ALGORITHMES Exemple d’objet fonction template <class T> class PremierPlusGrand { // Objet fonction : classe avec private: // surcharge de l'opérateur () T x_; public: PremierPlusGrand () : x_ (0) {} PremierPlusGrand (const T& x) : x_ (x) {} int operator () (const T& v) {return v > x_;} }; vector <int> v; ... // Vecteur initialisé à vector<int>::iterator i = find_if(v.begin(), v.end(), PremierPlusGrand <int> (3)); (i!=v.end()) ? cout<<*i : cout<<"element introuvable"; Résultat d'exécution : (premier élément du conteneur >3)

25 Ensemblistes (Extraits)
3. ALGORITHMES Ensemblistes (Extraits) set_union (InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result [,Compare comp]); Union des deux ensembles [first1 last1[ et [first2 last2[ Résultat dans un troisième ensemble set_intersection (InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp); Intersection des deux ensembles [first1 last1[ et [first2 last2[ Résultat dans un troisième ensemble set_difference (InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp); Différences entrel les deux ensembles [first1 last1[ et [first2 last2[ Résultat dans un troisième ensemble

26 Efficacité : objectif même des concepteurs (code efficace)
3. ALGORITHMES Avantages à utiliser STL Efficacité : objectif même des concepteurs (code efficace) Complexité maximale spécifiée pour les méthodes/algorithmes Algorithmes choisis pour l'implémentation des fonctionnalités sont les plus efficaces qui soient (les meilleurs connus à ce jour) Gain en production de logiciel dû à la réutilisation Nombre impressionnant d'algorithmes disponibles Couverture de tous les besoins courants des programmeurs Fiabilité : gain de fiabilité par réutilisation de composants Plus un composant est réutilisé, plus il est sûr Réutilisation et maintenabilité : facilitée par la standardisation Portabilité : a priori grâce à la norme ISO Applicabilité des algorithmes aux structures de données utilisateur

27 Exemple – Carnet téléphonique (Carnet.hpp)
ANNEXE Exemple – Carnet téléphonique (Carnet.hpp) #include <string> #include <map> #include <iterator> using namespace std; class Carnet { private: map<string, string> MCarnet; //map(clé=nom, valeur=téléphone) map<string, string>::iterator it; //iterateur it pour accès //et balayage de la map public: Carnet() {} void ajoute(string nom, string tel); //ajoute un enregistrement string getTel(string nom); //accesseur du numéro de téléphone string listeNom(string tel); //liste du/des nom(s) string listeCarnet(); //liste du carnet complet };

28 Exemple – Carnet téléphonique (Carnet.cpp)
ANNEXE Exemple – Carnet téléphonique (Carnet.cpp) #include "Carnet.h" using namespace std; void Carnet::ajoute(string nom, string tel) { MCarnet[nom] = tel; //ajoute/remplace l'enregistrement //correspondant à nom } string Carnet::getTel(string nom) { it = MCarnet.find(nom); //fin de conteneur si aucune clé //ne correspond à nom if (it == MCarnet.end()) return ""; return (*it).second; //retourne le numéro de téléphone

29 Exemple – Carnet téléphonique (Carnet.cpp)
ANNEXE Exemple – Carnet téléphonique (Carnet.cpp) string Carnet::listeNom(string tel) { string resultat = ""; for (it = MCarnet.begin(); it != MCarnet.end(); it++) if ((*it).second == tel) resultat += (*it).first + '\n'; return resultat; } string Carnet::listeCarnet() { string resultat; resultat += (*it).first + " : " + (*it).second + "\n";

30 Exemple – Carnet téléphonique (main.cpp)
ANNEXE Exemple – Carnet téléphonique (main.cpp) #include "Carnet.h" #include <iostream> using namespace std; void main() { Carnet C; string dupond = "Dupond Georges"; string telDupond = " "; C.ajoute("Martin Pierre", " "); C.ajoute(dupond, telDupond); C.ajoute("Dupond Jean", telDupond); C.ajoute("Durand Jacques", " "); C.ajoute("Durand Jacques", " "); cout << C.listeCarnet() << endl; cout << "Le numero de " << dupond << " est :"; string numTel = C.getTel(dupond); if (numTel.length() == 0) cout << "inconnu" << endl; else cout << numTel << endl << endl; cout << "Entree(s) du no " << telDupond << " :\n" << endl; string liste = C.listeNom(telDupond); if (liste.length() == 0) cout << "aucune entree"; else cout << liste << endl; }


Télécharger ppt "Cours n° 9 Conception et Programmation à Objets"

Présentations similaires


Annonces Google