72
~ A. P. ~ Chapitre 4 ~ POO en C++ ~ ~ POO en C++ ~ IUT A Informatique Informatique U U C C L L B B 1 Compléments Compléments Compléments Chapitre IV

Les E/SLes E/S - olazo.free.frolazo.free.fr/IUT/Cours/Compl%E9ments%20C++.pdf · ~ A. P. ~ ~ POO en C++ ~ Chapitre 4 IUT A Informatique UC LB 5 Les principales classes d'E/SLes principales

Embed Size (px)

Citation preview

~ 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