Post on 12-Sep-2018
~ A. P. ~Chapitre 4~ POO en C++ ~~ POO en C++ ~
IUT A InformatiqueInformatique
UUCCLLBB
1
ComplémentsComplémentsCompléments
Chapitre IV
~ A. P. ~Chapitre 4~ POO en C++ ~~ POO en C++ ~
IUT A InformatiqueInformatique
UUCCLLBB
2
Les E/SLes E/SLes E/S
~ A. P. ~Chapitre 4~ POO en C++ ~~ POO en C++ ~
IUT A InformatiqueInformatique
UUCCLLBB
3
Les streamsLes Les streamsstreams
Le C++ propose un ensemble de classes pour la gestion des E/S
les E/S sont implémentées par les streams appelés aussi flots ou flux un stream peut être représenté comme un buffer et des mécanismes associés pour réaliser l'E/Sil existe quatre streams prédéfinis:
cin : flux d'entrée standardcout: flux de sortie standardcerr: flux de sortie d'erreur non tamponnéclog: flux de sortie d'erreur tamponné
~ A. P. ~Chapitre 4~ POO en C++ ~~ POO en C++ ~
IUT A InformatiqueInformatique
UUCCLLBB
4
Graphe partiel d'héritageGraphe partiel d'héritageGraphe partiel d'héritage
istream ostream
ifstream iostream ofstream
fstream
ios
~ A. P. ~Chapitre 4~ POO en C++ ~~ POO en C++ ~
IUT A InformatiqueInformatique
UUCCLLBB
5
Les principales classes d'E/SLes principales classes d'E/SLes principales classes d'E/S
La classe de base pour toutes les E/S s'appelle ioselle est constituée à partir des classes ios_base et basic_ios définies dans <ios>elle offre un grand nombre de fonctions applicables à tous les objets des classes de la hiérarchie ios (se référer à la documentation en ligne)
fonctions de contrôle de l'état d'un fluxfonctions de mise en forme d'un fluxplus des manipulateurs pour formater ou modifier le fonctionnement d'un flux (voir <iomanip>)
elle n'est pas instanciable directement
~ A. P. ~Chapitre 4~ POO en C++ ~~ POO en C++ ~
IUT A InformatiqueInformatique
UUCCLLBB
6
Les principales classes d'E/SLes principales classes d'E/SLes principales classes d'E/S
Les classes istream et ostreamdéfinies dans <iostream>permettent un traitement uniforme pour tous les types de base par surcharge des opérateurs >> et <<surcharge possible pour tous les types construits
ostream & operator << (ostream & s, const T &);istream & operator >> (istream & s, T &);
cin est une instance de istream, cout de ostreamproposent un ensemble de méthodes de lecture, d'écriture, de positionnement, etc (voir la doc.)iostream est la classe pour les flux bidirectionnels
~ A. P. ~Chapitre 4~ POO en C++ ~~ POO en C++ ~
IUT A InformatiqueInformatique
UUCCLLBB
7
Les principales classes d'E/SLes principales classes d'E/SLes principales classes d'E/S
Les classes ifstream, ofstream et fstreamdéfinies dans <fstream>permettent de traiter les flux connectés à un fichieroffrent un ensemble de méthodes pour gérer les fichiers
ouverture mode d'accèsfermeture écriturelecture
~ A. P. ~Chapitre 4~ POO en C++ ~~ POO en C++ ~
IUT A InformatiqueInformatique
UUCCLLBB
8
ExemplesExemplesExemples
Exemples avec istream et ostreamchar c, s[15];cin.get(c); // saisie d'un caractèrecout.put(c); // affichage du caractère saisicin.ignore(1,'\n'); // filtrage du retour chariot
//saisie de la chaine s de 5 caractères max y compris \0cin.get(s,5,'\n'); // le délimiteur est '\n'
int n=127;cout << oct << n; // affiche 177 (127 en base 8)cout << hex << n; // affiche 7f (127 en base 16)cout.width(10); // largeur du champ affichécout.fill('*'); // caractères de remplissagecout << n; // affiche *******127
~ A. P. ~Chapitre 4~ POO en C++ ~~ POO en C++ ~
IUT A InformatiqueInformatique
UUCCLLBB
9
ExemplesExemplesExemples
Exemples avec istream et ostream (suite)double x=6.6789, y=123.26754;cout<<setw(10)<<setfill('*')<< x; // affiche ****6.6789
// affichage d'un réel avec partie fractionnaire cout.setf(ios::fixed,ios::floatfield);
// 3 chiffres après la virgule avec arrondicout << setprecision(3) << x; // affiche 6.679
// affichage d'un réel avec exposant cout.setf(ios::scientific,ios::floatfield);
// 4 chiffres après la virgule avec arrondicout << setprecision(4) << y; // affiche 1.2327e+002
~ A. P. ~Chapitre 4~ POO en C++ ~~ POO en C++ ~
IUT A InformatiqueInformatique
UUCCLLBB
10
ExemplesExemplesExemples
Exemples avec fstreamchar car;// déclaration et ouverture d'un fichier// mode ouverture = écriture pour ofstreamofstream fich ("Essai.txt");while (cin.get (car)) // saisie au clavier
fich.put (car); // écriture dans le fichierfich.close (); // fermeture du fichier
cout << "ouverture en mode lecture pour vérification \n";ifstream verif ("Essai.txt");while (verif.get (car))
cout.put (car);verif.close();
~ A. P. ~Chapitre 4~ POO en C++ ~~ POO en C++ ~
IUT A InformatiqueInformatique
UUCCLLBB
11
ExemplesExemplesExemples
Exemples avec fstream
// il est recommandé de tester si l'ouverture s'est// déroulée correctementfich.open ("Essai.txt", ios::out);if (!fich) {
cerr << "\nouverture fichier impossible";cerr << "\ntraitement interrompu";return -1;
}
// de même en écriturefich.open ("Essai.txt", ios::in);
~ A. P. ~Chapitre 4~ POO en C++ ~~ POO en C++ ~
IUT A InformatiqueInformatique
UUCCLLBB
12
Les exceptionsLes exceptionsLes exceptions
~ A. P. ~Chapitre 4~ POO en C++ ~~ POO en C++ ~
IUT A InformatiqueInformatique
UUCCLLBB
13
IntroductionIntroductionIntroduction
Il existe plusieurs approches pour le traitement des erreurs
écrire des fonctions qui renvoient un code d'erreur pour signaler une anomalieterminer le programme par un appel à exit(val) en testant la valeur de val au niveau de l'interpréteur de commandes ($? sous UNIX)utiliser la macro assert
Le C++ introduit maintenant un nouveau mécanisme de traitement des erreurs: la gestion des exceptions
~ A. P. ~Chapitre 4~ POO en C++ ~~ POO en C++ ~
IUT A InformatiqueInformatique
UUCCLLBB
14
Traitement par code retourTraitement par code retourTraitement par code retourLe concepteur prévoie lors de l'écriture d'une fonction une valeur (par exemple parmi une énumération) pour signaler à l'appelant une erreurenum T_CDRU {T_ERREUR, T_OK};T_CDRU Tableau :: inserer(int elem) {
if (nb_elem >= taille) return T_ERREUR;
tab[nb_elem]=elem;nb_elem++;return T_OK;
}
Mais l'appelant ne sait pas toujours corriger l'erreur et ne teste pas forcément le code retour
~ A. P. ~Chapitre 4~ POO en C++ ~~ POO en C++ ~
IUT A InformatiqueInformatique
UUCCLLBB
15
Traitement par exitTraitement par Traitement par exitexit
Le concepteur considère dans ce cas qu'une erreur est rédhibitoire et qu'elle met fin à l'exécution du programme
void Tableau :: inserer(int elem) { if (nb_elem >= taille)
exit(1);tab[nb_elem]=elem;nb_elem++;
}
Mais il s'agit dans ce cas d'une sortie violente qui reporte au niveau du shell la gestion du problème
~ A. P. ~Chapitre 4~ POO en C++ ~~ POO en C++ ~
IUT A InformatiqueInformatique
UUCCLLBB
16
Traitement par assertTraitement par Traitement par assertassert
Le concepteur prévoie ici un arrêt conditionnel par la macro assert(condition) qui fait un exit si la condition est faussevoid Tableau :: inserer(int elem) {
// precondition: tableau non pleinassert(nb_elem<taille);tab[nb_elem]=elem; nb_elem++;
}
Ceci est un bon moyen pour mettre au point le codeMais reste une solution rudimentaire (la sortie est brutale comme dans le cas avec exit)
~ A. P. ~Chapitre 4~ POO en C++ ~~ POO en C++ ~
IUT A InformatiqueInformatique
UUCCLLBB
17
Les exceptionsLes exceptionsLes exceptions
Principelorsqu'un appelant appelle une fonction susceptible de lancer une exception, il peut se porter candidat à la gestion des exceptions par le bloc trylorsqu'une erreur survient dans la fonction appelée, cette dernière lance une exception par throwpour gérer l'erreur l'appelant intercepte l'exception grâce au bloc catch (appelé gestionnaire)
tout gestionnaire dispose d'un paramètre dont le type indique quelle sorte d'exception il sait traiterune exception ne peut être interceptée que par un gestionnaire de type compatible
~ A. P. ~Chapitre 4~ POO en C++ ~~ POO en C++ ~
IUT A InformatiqueInformatique
UUCCLLBB
18
AvantagesAvantagesAvantages
Le code retour des fonctions n'est plus réservé à la signalisation des erreurs
Ce mécanisme permet aussi de gérer les erreurs pour les constructeurs qui n'ont pas de valeur de retour
Si en remontant dans la pile des appels aucun gestionnaire d'exception adéquat n'a été prévu pour le type d'erreur générée, l'erreur non traitée conduit alors à l'arrêt du traitement
~ A. P. ~Chapitre 4~ POO en C++ ~~ POO en C++ ~
IUT A InformatiqueInformatique
UUCCLLBB
19
Lancement d'une exceptionLancement d'une exceptionLancement d'une exception
Le lancement d'une exception se fait pour signaler une erreur
syntaxe: throw expr où expr est une expression de type quelconque sauf voidexemple: ici expr est de type const char *
void Tableau :: inserer(int elem) { if (nb_elem>=taille) // tableau plein
throw "tableau plein"; tab[nb_elem]=elem; // sinon en fin de tableau++nb_elem;
}
~ A. P. ~Chapitre 4~ POO en C++ ~~ POO en C++ ~
IUT A InformatiqueInformatique
UUCCLLBB
20
Interception d'une exception Interception d'une exception Interception d'une exception
Pour pouvoir traiter une exception, il faut d'abord déclaré un bloc qui est candidat pour intercepter les exceptions
syntaxe try {
NomFonction( ); // ou instructions; }
le bloc try lance la fonction où les instructions qui peuvent générer une exception il doit être suivi du bloc catch
~ A. P. ~Chapitre 4~ POO en C++ ~~ POO en C++ ~
IUT A InformatiqueInformatique
UUCCLLBB
21
Interception d'une exception Interception d'une exception Interception d'une exception
Il faut ensuite décrire le gestionnaire d'exception grâce au bloc catch ()
syntaxe catch (Type Nom) {
...; // traitement de l'exception; }
précise le traitement à effectuer si une exception est lancée par throw exprseule une exception dont le type expr est compatible avec le type Type de catch peut être traitéesinon son traitement est délégué en remontant dans les appels jusqu'à trouver un type correct de catch
~ A. P. ~Chapitre 4~ POO en C++ ~~ POO en C++ ~
IUT A InformatiqueInformatique
UUCCLLBB
22
Interception d'une exceptionInterception d'une exceptionInterception d'une exception
Void Fonc() {
...
if (probleme)
throw 3;
...
}
try {
Fonc();
}
catch (int x) {
...
}
...
...
type int
~ A. P. ~Chapitre 4~ POO en C++ ~~ POO en C++ ~
IUT A InformatiqueInformatique
UUCCLLBB
23
Interception d'une exception Interception d'une exception Interception d'une exception
Exemple: // bloc trytry {
// on invoque la méthode insérer sur l'objet t1 // cette méthode lance une exception de type const char *// si le tableau t1 est plein t1.inserer(elem);
} // --- fin du bloc try
// bloc catch: intercepte des exceptions de type const char * catch (const char * msg) {
cout << msg;} // --- fin du bloc catch
~ A. P. ~Chapitre 4~ POO en C++ ~~ POO en C++ ~
IUT A InformatiqueInformatique
UUCCLLBB
24
Classe de gestion d'exceptionClasse de gestion d'exceptionClasse de gestion d'exception
Le concepteur peut écrire ses propres classes d'exceptionExemple : classe ChaineException de gestion des exceptions associée à la classe Chaine:
class ChaineException { // dans Chaine.hprivate:
char mesg[512]; // le message de l'exceptionpublic:
// constructeurChaineException(const char * s) { strcpy(mesg,s); }// pour affichage du messagechar * getmsg() { return mesg; }
}; // class ChaineException
~ A. P. ~Chapitre 4~ POO en C++ ~~ POO en C++ ~
IUT A InformatiqueInformatique
UUCCLLBB
25
Classe de gestion d'exceptionClasse de gestion d'exceptionClasse de gestion d'exception
Exemple de lancement d'une exception de type ChaineException dans un constructeur de la classe ChaineChaine::Chaine(int taille) {
s=new char[taille +1];if (s == 0) // si le new echoue on lance l'exception
throw (new ChaineException("Erreur memoiredans le constructeur"));
else {*s='\0';max=taille;
}}
~ A. P. ~Chapitre 4~ POO en C++ ~~ POO en C++ ~
IUT A InformatiqueInformatique
UUCCLLBB
26
Classe de gestion d'exceptionClasse de gestion d'exceptionClasse de gestion d'exception
Exemple de gestion d'une exception de typeChaineException dans le programme utilisateurtry { // traitement normal
ptch1 = new Chaine(128);...
}catch(ChaineException * ptCE) {
// s'il y a une erreur memoire dans le constructeur// on affiche le message d'erreur et on sortcout <<"\n\n" << ptCE->getmsg() <<"\n\n";exit (1);
}
~ A. P. ~Chapitre 4~ POO en C++ ~~ POO en C++ ~
IUT A InformatiqueInformatique
UUCCLLBB
27
Les modèlesLes modèlesLes modèles
~ A. P. ~Chapitre 4~ POO en C++ ~~ POO en C++ ~
IUT A InformatiqueInformatique
UUCCLLBB
28
IntroductionIntroductionIntroduction
Problème du typage des donnéeschaque type a une représentation interne particulière (IEEE 754 pour les réels, C2 pour les entiers,etc )et un certain nombre d'opérateurs associés (exemple pour les int et les float l'égalité est testé par l'opérateur == alors que pour les char * il faut invoquer la fonction strcmp de la bibliothèque)DONC pour une même méthode de résolution d'un problème, l'implémentation doit se faire autant de fois qu'il y a de types différents
1 algorithme = n implémentations
~ A. P. ~Chapitre 4~ POO en C++ ~~ POO en C++ ~
IUT A InformatiqueInformatique
UUCCLLBB
29
IntroductionIntroductionIntroductionPour augmenter la réutilisabilité du code, il faut donc essayer de s'affranchir des typesUne première solution: écrire des fonctions universelles qui s'appliquent indépendamment du type (en C-ANSI ou en C++)
nombre élevé de paramètrespointeur sur la ou les fonctions à utiliser dès lors que son implémentation dépend du typeexemple: recherche d'un élément dans un tableau triéStatus_TABLEAU dichoto (void * tab, void * pt_el, int taille_el, int nb_elem,int (* ptf_cmp)(void *, void *), int * place) ;
~ A. P. ~Chapitre 4~ POO en C++ ~~ POO en C++ ~
IUT A InformatiqueInformatique
UUCCLLBB
30
ModèleModèleModèleUne autre solution offerte par le C++ est de construire un modèle
il s'agit d'un mécanisme de généricitéqui permet d'instancier un modèle autant de fois qu'il y a de types différentsl'instanciation du modèle
est faite à la compilation suivant les besoinsn'est possible que si le compilateur peut produire le code pour le type voulu, ce qui implique la surcharge des opérateurs utilisés
On parle de template ou encore de patron
~ A. P. ~Chapitre 4~ POO en C++ ~~ POO en C++ ~
IUT A InformatiqueInformatique
UUCCLLBB
31
GénéricitéGénéricitéGénéricité
Un modèle (template)permet de définir des modèles génériques de classes et des modèles génériques de fonctionsalourdit le code mais n'altère pas l'efficacité à l'exécution car tout se passe comme si le concepteur avait écrit lui même le code pour chaque typeest surtout mis en œuvre pour concevoir des objets techniques
La généricité et l'héritage peuvent être combinés
~ A. P. ~Chapitre 4~ POO en C++ ~~ POO en C++ ~
IUT A InformatiqueInformatique
UUCCLLBB
32
Classe génériqueClasse génériqueClasse générique
Une classe générique (ou modèle de classe) est un type paramètré qui se définit en
faisant précéder la définition de la classe par template <typename T>le mot template indique qu'il s'agit d'un modèlele mot clé typename déclare le paramètre typeon peut utiliser class à la place de typenameT est le nom formel choisi ici pour nommer le paramètre typeil peut y avoir plusieurs paramètres type pour un même modèle (ex: template <class A, class B>)
~ A. P. ~Chapitre 4~ POO en C++ ~~ POO en C++ ~
IUT A InformatiqueInformatique
UUCCLLBB
33
Exemple de classe génériqueExemple de classe génériqueExemple de classe générique
Définition d'une classe générique Tableau_Basetemplate <typename T> class Tableau_Base {
protected:int taille;int nb_elem;T * tab;
public:Tableau_Base (int taille = TAILLE_DEFAUT);~Tableau_Base ();int taille_tableau() const { return taille; }int nombre_element() const { return nb_elem; }const T & operator [] (int);
};
~ A. P. ~Chapitre 4~ POO en C++ ~~ POO en C++ ~
IUT A InformatiqueInformatique
UUCCLLBB
34
Exemple d'héritage de modèle
Exemple d'héritage de Exemple d'héritage de modèlemodèle
Définition de la classe Tableau_Trié qui hérite de la classe générique Tableau_Base
template <typename T>class Tableau_Trie: public Tableau_Base <T> {
public:Tableau_Trie(int nb): Tableau_Base <T> (nb) {}Tableau_Trie(): Tableau_Base <T> () {}T_CDRU rechercher(int & place, T elem) const;T_CDRU inserer(int & place, T elem);T_CDRU supprimer(int & place, T elem);
};
~ A. P. ~Chapitre 4~ POO en C++ ~~ POO en C++ ~
IUT A InformatiqueInformatique
UUCCLLBB
35
Méthodes d'une classe générique
Méthodes d'une classe Méthodes d'une classe génériquegénérique
Les fonctions membres d'une classe générique qui n'ont pas été définies dans la classe doivent l'être en dehorsPour cela
chaque définition de méthode doit être précédée de template <typename T>ce qui précise que la définition dépend du type Tcomme pour toute définition de méthode en dehors de l'interface, il faut la faire précéder du nom de la classe suivi de l'opérateur de résolution de portée :le nom de la classe est NomClasse <T>
~ A. P. ~Chapitre 4~ POO en C++ ~~ POO en C++ ~
IUT A InformatiqueInformatique
UUCCLLBB
36
Exemple de méthode générique
Exemple de méthode Exemple de méthode génériquegénérique
Constructeur du modèle Tableau_Base
template <typename T> Tableau_Base<T> :: Tableau_Base (int nb) {
if (nb<1)nb=1;
taille=nb;if ((tab = new T[taille])== 0)
taille=0;nb_elem=0;
}
~ A. P. ~Chapitre 4~ POO en C++ ~~ POO en C++ ~
IUT A InformatiqueInformatique
UUCCLLBB
37
Exemple de méthode générique
Exemple de méthode Exemple de méthode génériquegénérique
Définition de la méthode rechercher de la classe générique Tableau_Trie
la méthode utilisée est la recherche dichotomiquele tableau peut contenir des doublons et on veut se positionner sur le premier des doublonsla fonction générique proposée dans l'exemple utilise les opérateurs relationnels < == et >il faut donc que ces opérateurs soient définis pour le type voulu afin que l'instanciation puisse se réaliser
~ A. P. ~Chapitre 4~ POO en C++ ~~ POO en C++ ~
IUT A InformatiqueInformatique
UUCCLLBB
38
Exemple de méthode générique
Exemple de méthode Exemple de méthode génériquegénérique
template <typename T> T_CDRU Tableau_Trie<T>::rechercher(int &place, T elem) const {int milieu, b_sup=nb_elem-1, b_inf=0, j;while (b_sup>=b_inf) {milieu=(b_sup+b_inf)/2;if (tab[milieu]>elem)
b_sup=milieu-1; else if (tab[milieu]<elem)
b_inf=milieu+1;else { // il faut remonter au premier des doublons
for (j=milieu;j>=0 && tab[j]==elem;place=j,j--);return(T_TROUVE);
}}
place = b_inf;return(T_ABSENT);}
~ A. P. ~Chapitre 4~ POO en C++ ~~ POO en C++ ~
IUT A InformatiqueInformatique
UUCCLLBB
39
Organisation d'un templateOrganisation d'un Organisation d'un templatetemplate
L'instanciation d'un template est faite à la compilationIl faut donc que le compilateur est accès au code du template dans sa totalitéC'est pourquoi un template est organisé en un seul fichier d'extension .h qui contient
la définition de la classe générique et éventuellement des classes génériques dérivéesla définition de toutes les méthodes de ces classes
REMARQUE: les templates de la STL sont décrits dans des headers sans l'extension .h
~ A. P. ~Chapitre 4~ POO en C++ ~~ POO en C++ ~
IUT A InformatiqueInformatique
UUCCLLBB
40
Utilisation d'un templateUtilisation d'un Utilisation d'un templatetemplate
Pour utiliser un templateil suffit d'inclure le header le décrivant puis préciser au compilateur avec quel type il faut instancier le modèleexemple: déclaration d'un tableau trié de 10 chaînesTableau_Trie <Chaine> t1(10); on peut instancier un template avec un autre
//un arbre de listes d'entiers Arbre <Liste <int> >;l'espace entre les 2 signes > est obligatoire, sinon il y a confusion possible avec l'opérateur >>
~ A. P. ~Chapitre 4~ POO en C++ ~~ POO en C++ ~
IUT A InformatiqueInformatique
UUCCLLBB
41
La STLLa La STLSTL
~ A. P. ~Chapitre 4~ POO en C++ ~~ POO en C++ ~
IUT A InformatiqueInformatique
UUCCLLBB
42
PrésentationPrésentationPrésentation
La STLStandard Template Librarybibliothèque de composants prédéfinis
modèles, types et constantesmembres de l'espace de nom stdlivrés sous forme de fichier d'en-tête inclus par #include <nom_en_tete> sans l'extension .h
implémentent des structures de données classiques permettant de définir des objets techniques
~ A. P. ~Chapitre 4~ POO en C++ ~~ POO en C++ ~
IUT A InformatiqueInformatique
UUCCLLBB
43
PrésentationPrésentationPrésentation
Les composants sont répartis en 5 catégoriesles conteneurs: pour stocker d’autres objets.les itérateurs : pour visiter les conteneursles algorithmes : procédures de traitement opérant sur les différents conteneursles objet fonctions: classes qui redéfinissent l’opérateur d’appel de fonction ()les adaptateurs : encapsulation d’un autre composant pour fournir une autre interface.
Seuls quelques composants sont présentés partiellement ici
~ A. P. ~Chapitre 4~ POO en C++ ~~ POO en C++ ~
IUT A InformatiqueInformatique
UUCCLLBB
44
Classe stringClasse Classe stringstring
Cette classe ne fait pas partie réellement de laSTL, mais peut être vue comme un conteneur de caractèresPour l'utiliser il faut
inclure la description du modèle par <string>introduire tous les identificateurs de l'espace de noms std dans la région déclarative par using namespace std
Pour connaître toutes les fonctionnalités de la classe string voir la documentation en ligne
~ A. P. ~Chapitre 4~ POO en C++ ~~ POO en C++ ~
IUT A InformatiqueInformatique
UUCCLLBB
45
Classe stringClasse Classe stringstring
Exemple#include <string>using namespace std;
// essai de constructeursstring ch1("hello"), // initialisation par une chaîne Cch2("essai",4), // initialisation avec les 4 premiers carch3(5,'*'), // initialisation avec 5 fois le car * ch4; // chaîne vide
x=ch1.length(); // longueur de la chaîne ch1cout<<ch1.at(0); // affiche le premier caractère de ch1cout<<ch1[0]; // idem
~ A. P. ~Chapitre 4~ POO en C++ ~~ POO en C++ ~
IUT A InformatiqueInformatique
UUCCLLBB
46
Classe stringClasse Classe stringstring
Exemple (suite)ch2.swap(ch3);// échange les contenus des chaînes ch2 et ch3
if (ch4.empty()) // teste si la chaîne ch4 est vide if (ch4 == ch1) // opérateur d'égalité des contenus
ch4 = ch1 + ch2; // ch4 = concaténation de ch1 et ch2
pos = ch1.find('n',0);// pos contient la première position du caractère n dans la// chaine ch1 (0 pour la position en tête)
pos = ch1.rfind('a');// pos contient la dernière position du caractère a dans la// chaine ch1
~ A. P. ~Chapitre 4~ POO en C++ ~~ POO en C++ ~
IUT A InformatiqueInformatique
UUCCLLBB
47
Classe stringClasse Classe stringstring
Exemple (fin)// concaténation avec une chaine C-ANSIch4 = ch4 + ".data";
// transformation d'un string en char *
char temp[26];
strcpy (temp,ch4.c_str()); // attention c_str renvoie le pointeur uniquement// donc il faut ensuite recopier la zone par strcpy
~ A. P. ~Chapitre 4~ POO en C++ ~~ POO en C++ ~
IUT A InformatiqueInformatique
UUCCLLBB
48
Classe iteratorClasse Classe iteratoriterator
Les itérateurs représententun outil liés aux conteneurs permettant d'exécuter des itérations sur les conteneursdonc généralement définis comme classes internes des conteneurs
Il existe différents types d'itérateur séquentiel unidirectionnel du début à la finséquentiel unidirectionnel de la fin au débutséquentiel bidirectionnelà accès direct
~ A. P. ~Chapitre 4~ POO en C++ ~~ POO en C++ ~
IUT A InformatiqueInformatique
UUCCLLBB
49
Classe iteratorClasse Classe iteratoriterator
Un itérateur bidirectionnel peut être utilisé à la place d'un unidirectionnelUn itérateur à accès direct peut remplacer un itérateur bidirectionnelDeux itérateurs de même type peuvent être comparésL'opérateur * appliqué à un itérateur renvoie la valeur de l'élément courant dans le conteneur qui utilise cet itérateurLes exemples sur les conteneurs utilisent des itérateurs
~ A. P. ~Chapitre 4~ POO en C++ ~~ POO en C++ ~
IUT A InformatiqueInformatique
UUCCLLBB
50
Classe vectorClasse Classe vectorvector
Cette classe définit un conteneur assez identique aux tableaux du C-ANSI
il s'agit d'une collection d'objets de même typeà laquelle on peut accéder par des itérateurs séquentiel ou direct
Des méthodes permettent d'insérer ou de supprimer des éléments dans le conteneurLe modèle dispose aussi de l'opérateur [] pour un accès direct aux éléments
~ A. P. ~Chapitre 4~ POO en C++ ~~ POO en C++ ~
IUT A InformatiqueInformatique
UUCCLLBB
51
Classe vectorClasse Classe vectorvector
Exemple (sous Visual C++)#include <iterator>#include <vector>using namespace std;
vector<int> v ; //declaration d'un vecteur d'entiers
//déclarations des iterateurs sur un conteneur vector<int>vector<int>::iterator it;
vector<int>::reverse_iterator it_r;
// remplissage du vecteur par la finfor (i=0; i<15 ; i++) v.push_back(i) ;
// affichage en visitant le conteneur du début à la finfor (it=v.begin() ;it != v.end() ; ++it)
cout << * it <<" " ; // valeur de l'élément par *
~ A. P. ~Chapitre 4~ POO en C++ ~~ POO en C++ ~
IUT A InformatiqueInformatique
UUCCLLBB
52
Classe vectorClasse Classe vectorvector
Exemple (suite)
// affichage en visitant le conteneur du début à la finfor (it=v.begin() ;it != v.end() ; ++it)
cout << * it <<" " ; // valeur de l'élément par *
// affichage en visitant le conteneur dans le sens invsersefor (it_r=v.rbegin() ;it_r != v.rend(); ++it_r)
cout << * it_r <<" " ;
x = v[i]; // accès direct à l'élément de rang i
//insertion de l'element 33 deux fois au rang de l'itérateur v.insert(it,2,33);
// suppression des elements du rang 1 au rang 3 (it+4 exclu)it=v.begin(); v.erase(it+1,it+4);
~ A. P. ~Chapitre 4~ POO en C++ ~~ POO en C++ ~
IUT A InformatiqueInformatique
UUCCLLBB
53
Classe vectorClasse Classe vectorvector
Exemple (fin)
cout << v.front(); // affichage de l'élément en tete
v.back(); // affichage de l'élément en fin
v.clear(); // nettoyage du tableau
if (v.empty()) // si tableau vide
nb_elt=v.size(); // nombre d'éléments dans le conteneur
~ A. P. ~Chapitre 4~ POO en C++ ~~ POO en C++ ~
IUT A InformatiqueInformatique
UUCCLLBB
54
Classe listClasse Classe listlist
Cette classe implémente un conteneur de type liste doublement chaînée
null
front (tête)
back (fin)
null
~ A. P. ~Chapitre 4~ POO en C++ ~~ POO en C++ ~
IUT A InformatiqueInformatique
UUCCLLBB
55
Classe listClasse Classe listlist
Le modèle est décrit dans <list>Les principales opérations fournies
insertion d'éléments en tête, en queue mais aussi à un endroit quelconquesuppression d'un élément en tête ou en queueremplacement d'un élément dans la listetri, inversion d'une listeélimination des doublons d'une listefusion entre deux listes triées
~ A. P. ~Chapitre 4~ POO en C++ ~~ POO en C++ ~
IUT A InformatiqueInformatique
UUCCLLBB
56
Classe listClasse Classe listlist
Exemple (sous Visual C++) #include <list>#include <iterator>#include <functional>#include <algorithm>using namespace std;
list <int> l ; // déclaration d'une liste d'entiers//déclarations des iterateurs sur un conteneur list<int>list<int>::iterator it;list<int>::reverse_iterator it_r;
for (i=0; i<15 ; i++)l.push_back(i) ; // on remplit la liste par la fin
~ A. P. ~Chapitre 4~ POO en C++ ~~ POO en C++ ~
IUT A InformatiqueInformatique
UUCCLLBB
57
Classe listClasse Classe listlist
Exemple (suite)// parcours par itérateurs et affichage de la liste l for (it=l.begin() ;it != l.end() ; ++it)
cout << *it <<" " ;for (it_r=l.rbegin() ;it_r != l.rend(); ++it_r)
cout << *it_r <<" " ;
cout << l.size(); //nombre d'éléments dans la listel.insert(l.begin(),3,255); //insertion en tête de 255 (3 fois)
if (l.empty()) // teste si la liste l est vide
l.sort(); // tri de la liste lel.merge(l_bis); // fusion des listes l et l_bis dans ll.reverse(); // inversion de la liste ll.unique(); // élimination des doublons de la liste l
~ A. P. ~Chapitre 4~ POO en C++ ~~ POO en C++ ~
IUT A InformatiqueInformatique
UUCCLLBB
58
Classe listClasse Classe listlist
Exemple (fin)// recherche de l'élément = 15 grâce à l'algorithme find// si l'élément est absent alors it=l.end() et *it!=15it = find(l.begin(),l.end(),15);*it = 3615 // on remplace 15 par 3615
// recherche de 3615 grâce à l'algorithme find_if en utilisant// l'objet fonction bind1st avec la fonction equal_to it=find_if(l.begin(),l.end(),bind1st(equal_to<int>(),3615));*it=15; // on remet 15 à la place de 3615
l.erase(it1,it2); // détruit l'intervalle entre les itérateurs
cout << l.front(); // affiche l'élément en tête cout << l.back(); // affiche l'élément en fin l.clear(); // nettoie la liste
~ A. P. ~Chapitre 4~ POO en C++ ~~ POO en C++ ~
IUT A InformatiqueInformatique
UUCCLLBB
59
Classe dequeClasse Classe dequedeque
Ce conteneur est une double queuepermettant des insertions et des suppressions en tête et en fin de queue en temps constant quelle que soit la taille de la queueles insertions et les suppressions en milieu de la queue sont de complexité linéaireil est particulièrement optimisé pour des ajouts et des retraits aux extrémités (cas des piles, file d'attente, etc)
Le modèle est décrit dans <deque>
~ A. P. ~Chapitre 4~ POO en C++ ~~ POO en C++ ~
IUT A InformatiqueInformatique
UUCCLLBB
60
Classe dequeClasse Classe dequedeque
Exemple (sous Visual C++) #include <deque>#include <algorithm>#include <iostream>#include <iterator>using namespace std;
// définition dun conteneur deque d'entiers et des itérateursdeque<int> q, q_bis;deque<int>::iterator it;deque<int>::reverse_iterator it_r;
q.push_front(i); // empilage de l'entier i en têteq.push_back(i); // empilage de l'entier i en fin cout << q.front(); // affichage de l'entier en têtecout << q.back(); // affichage de l'entier en fin
~ A. P. ~Chapitre 4~ POO en C++ ~~ POO en C++ ~
IUT A InformatiqueInformatique
UUCCLLBB
61
Classe dequeClasse Classe dequedeque
Exemple (suite)//affichage de la tête vers la finfor (it=q.begin() ;it != q.end() ; ++it)
cout << *it <<" " ;
// modification du troisième élément par l'opérateur [ ]q[2]=3615;
// suppression du troisième élémentit=q.begin() + 2; // positionnement q.erase(it); // effaçage
q.swap(q_bis); // q recopiée dans q_bis (q vide après)
if (q.empty()) // vrai si q vide
cout << q.size() // affiche le nombre d'éléments présentsq.clear() // nettoie la queue
~ A. P. ~Chapitre 4~ POO en C++ ~~ POO en C++ ~
IUT A InformatiqueInformatique
UUCCLLBB
62
Classe dequeClasse Classe dequedeque
Exemple (fin)// insertion de trois fois l'élément 255 en tête q.insert(q.begin(),3,255);
// vidage des 4 premiers éléments en tête de la queue for (i=0;i<4;i++) {
cout << q.front() <<"-"; // affichage élément en fin q.pop_front(); // on enlève l'élément en tête
}
// vidage des 3 premiers éléments en fin de la queue for (i=0;i<3;i++) {cout << q.back() <<"-"; // affichage élément en débutq.pop_back(); // on enlève l'élément en queue
}
~ A. P. ~Chapitre 4~ POO en C++ ~~ POO en C++ ~
IUT A InformatiqueInformatique
UUCCLLBB
63
Classe queueClasse Classe queuequeue
class queue est un adaptateur de conteneurc'est à dire qu'il est construit par dessus un autre conteneur qui doit posséder les membres front, back, push_back et pop_frontles conteneurs sous-jacents utilisés peuvent être list ou deque mais pas vectorcette classe permet d'implémenter le type abstrait file d'attente (FIFO)
Le modèle est décrit dans <queue>
~ A. P. ~Chapitre 4~ POO en C++ ~~ POO en C++ ~
IUT A InformatiqueInformatique
UUCCLLBB
64
Classe queueClasse Classe queuequeue
Exemple (sous Visual C++) #include <queue>#include <list>using namespace std;
//---declaration d'une queue d'entiers rqueue <int, list<int> > q; // construite à partir d'une liste
q.push(i); // place l'entier i dans la file (en fin) q.pop() // retire l'élément en tête de la file cout << q.front(); // affiche le premier élément entré cout << q.back(); // affiche le dernier lélément entré
if (q.empty()) // vrai si file videcout << q.size() // donne le nombre d'éléments dans la file
~ A. P. ~Chapitre 4~ POO en C++ ~~ POO en C++ ~
IUT A InformatiqueInformatique
UUCCLLBB
65
Classe stackClasse Classe stackstack
class stack est un adaptateur de conteneurqui peut être construit à partir des conteneurs listdeque ou vectorcette classe permet d'implémenter le type abstrait pile (LIFO)
Le modèle est décrit dans <stack>
~ A. P. ~Chapitre 4~ POO en C++ ~~ POO en C++ ~
IUT A InformatiqueInformatique
UUCCLLBB
66
Classe stackClasse Classe stackstack
Exemple (sous Visual C++) #include <stack>#include <vector>using namespace std;
//---declaration d'une pile d'entiers stack <int, vector<int> > s; // construite à partir de vector
s.push(i); // empile i x=s.top() // on récupère le dernier élément empilés.pop(); // dépile le dernier élémentif (s==s_bis) // vrai si les 2 piles ont le même contenuif (s.empty()) // vrai si pile videcout << s.size() // donne le nombre d'éléments dans la pile
~ A. P. ~Chapitre 4~ POO en C++ ~~ POO en C++ ~
IUT A InformatiqueInformatique
UUCCLLBB
67
Classe priority_queueClasse Classe prioritypriority_queue_queue
class priority_queue est un adaptateur de conteneur
qui peut être construit à partir du conteneur dequecette classe permet d'implémenter une file d'attente avec prioritéen associant un ordre aux éléments en fonction de la prioritéla priorité est en fait une relation d'ordre définie par une fonction ou un objet fonction
~ A. P. ~Chapitre 4~ POO en C++ ~~ POO en C++ ~
IUT A InformatiqueInformatique
UUCCLLBB
68
Classe priority_queueClasse Classe prioritypriority_queue_queue
Exemple (sous HP-UX)#include <string>#include <queue>#include <deque>
//---declaration d'une file d'attente avec priorité priority_queue<string, deque<string>, less<string> > q;
q.push(ch1) ; // stocke l'élément ch1 q.top(); // récupère l'élément le plus prioritaireq.pop(); // rétire l'élément le plus prioritairecout << q.size() // donne le nombre d'éléments
~ A. P. ~Chapitre 4~ POO en C++ ~~ POO en C++ ~
IUT A InformatiqueInformatique
UUCCLLBB
69
Classe mapClasse Classe mapmap
Conteneur associatifconstitué à partir d'une paire clé, valeurchaque clé est unique
Les opérations ordinaires sontinsertion suppression à partir d'une valeur de clérecherche à partir d'une valeur de clé
C'est le conteneur type pour implémenter une collection d'objets comportant un identifiant
~ A. P. ~Chapitre 4~ POO en C++ ~~ POO en C++ ~
IUT A InformatiqueInformatique
UUCCLLBB
70
Classe mapClasse Classe mapmapExemple #include "Produit.h"#include <map>
Produit * Ptprod; // definition du type pointeur sur ProduitPtProd ptprod; // definition d'un pointeur PtProd
//--- conteneur de pointeurs sur Produits tries ---------// cle = numero produit de type string// donnee = un pointeur sur objet ∀ de la hierarchie Produit
// definition du type SETPTPROD map de pointeurs PtProd typedef map <string, PtProd, less<string>,allocator<PtProd> >
SETPTPROD;
typedef SETPTPROD::value_type value_type;
SETPTPROD setptprod; // instanciation du map
~ A. P. ~Chapitre 4~ POO en C++ ~~ POO en C++ ~
IUT A InformatiqueInformatique
UUCCLLBB
71
Classe mapClasse Classe mapmap
Exemple (suite)
//--- remplissage du conteneur ------------------------
for (i=0; i<3 ; i++) {cout <<"\n quel produit? 1-Perissable, 2-NonPerissable : ";cin >> rep;if (rep==1)
ptprod = new ProduitPerissable;else
ptprod = new ProduitNonPerissable;cout << "\n entrez le produit a inserer : ";ptprod->saisie();setptprod[ptprod->numprod()]=ptprod;
}
~ A. P. ~Chapitre 4~ POO en C++ ~~ POO en C++ ~
IUT A InformatiqueInformatique
UUCCLLBB
72
Classe mapClasse Classe mapmapExemple (fin)
SETPTPROD::iterator ite; // definition d'un iterateur
//--- affichage du conteneur selon l'ordre des cles--------for (ite = setptprod.begin(); ite!=setptprod.end(); ite++)
(ite->second)->affiche();
//--- suppression d'un produit ----------------------------cout <<"\n entrer le numero du produit a supprimer: ";cin >> nprod;ite = setptprod.find(nprod); // recherche de l'element if (ite == setptprod.end()) // echec
cout << "\nelement non trouve ";else
setptprod.erase(ite); // suppression du produit du conteneur