Introduction à la STL (en C++)



Documents pareils
TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

et Programmation Objet

Introduction à la programmation Travaux pratiques: séance d introduction INFO0201-1

Cours d Algorithmique et de Langage C v 3.0

Package Java.util Classe générique

Cours d initiation à la programmation en C++ Johann Cuenin

1.6- Génération de nombres aléatoires

Cours de C++ François Laroussinie. 2 novembre Dept. d Informatique, ENS de Cachan

Programmation Par Objets

Génie Logiciel avec Ada. 4 février 2013

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

Java 1.5 : principales nouveautés

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

Initiation. àl algorithmique et à la programmation. en C

4. Groupement d objets

Brefs rappels sur la pile et le tas (Stack. / Heap) et les pointeurs

Génie Logiciel I. Cours VI - Typage statique / dynamique, fonctions virtuelles et classes abstraites, flots d entrées / sorties, et string

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

TD/TP PAC - Programmation n 3

Chap III : Les tableaux

M2-Images. Rendu Temps Réel - OpenGL 4 et compute shaders. J.C. Iehl. December 18, 2013

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Projet L1, S2, 2015: Simulation de fourmis, Soutenance la semaine du 4 mai.

Algorithmique, Structures de données et langage C

Suivant les langages de programmation, modules plus avancés : modules imbriqués modules paramétrés par des modules (foncteurs)

Programmation C++ (débutant)/instructions for, while et do...while

Département Automatisation et Informatisation Année Programmation en C++ Institut des Sciences et Techniques de l Ingénieur d Angers

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51


Introduction au pricing d option en finance

Les structures de données. Rajae El Ouazzani

COMPARAISONDESLANGAGESC, C++, JAVA ET

Introduction à l héritage en C++

TD/TP PAC - Programmation n 3

Plan du cours. Historique du langage Nouveautés de Java 7

Expression des contraintes. OCL : Object C o n t r a i n t L a n g u a g e

03/04/2007. Tâche 1 Tâche 2 Tâche 3. Système Unix. Time sharing

Une introduction à Java

Programmation Orientée Objet Java

Introduction à MATLAB R

I. Introduction aux fonctions : les fonctions standards

Le langage C. Séance n 4

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

Généralités sur le Langage Java et éléments syntaxiques.

Chapitre V. Les classes : Object, Vector, etc.

Algorithmique I. Algorithmique I p.1/??

T. A. D. pile. Chapitre 7 (suite) Listes particulières. T. A. D. file. représentation chaînée de la file algorithmique. Files

LES TYPES DE DONNÉES DU LANGAGE PASCAL

Génération de code binaire pour application multimedia : une approche au vol

Programmation système I Les entrées/sorties

Algorithmique & programmation

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

Composants génériques de calcul scientifique

Structure fonctionnelle d un SGBD

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

INFO-F-105 Language de programmation I Séance VI

Bases de programmation. Cours 5. Structurer les données

Le langage C++ (partie I)

Exercices sur les interfaces

Travaux Dirigés n 1 : chaînes de caractères

Programmer en JAVA. par Tama

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

Java Licence Professionnelle CISII,

Cours de C/C++ par la pratique. Hugues Talbot

Premiers Pas en Programmation Objet : les Classes et les Objets

Une bibliothèque de templates pour CUDA

Conventions d écriture et outils de mise au point

Construire des plug-ins pour SAS Management Console SAS 9.1

CHAPITRE V. Recherche et tri

Claude Delannoy. 3 e édition C++

Objets et Programmation. origine des langages orientés-objet

TP3 : Manipulation et implantation de systèmes de fichiers 1

Chapitre 10. Les interfaces Comparable et Comparator 1

Rapport de Mini-Projet en ArcGIS Engine

Plan du cours Cours théoriques. 29 septembre 2014

P r ob lé m a t iq u e d e la g é n é r icit é. Pr in cip e d e la g é n é r icit é e n Ja v a ( 1 /3 )

as Architecture des Systèmes d Information

4 Exemples de problèmes MapReduce incrémentaux

ETUDE DE CAS en UML : GESTION DES COMMANDES DE PIECES FABRIQUEES PAR LA SOCIETE C

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Algorithmique et Programmation, IMA

Les structures. Chapitre 3

2. Comprendre les définitions de classes

TD3: tableaux avancées, première classe et chaînes

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

Langage propre à Oracle basé sur ADA. Offre une extension procédurale à SQL

Programmation stochastique

Utilisation d objets : String et ArrayList

Bases de données élémentaires Maude Manouvrier

# let rec concat l1 l2 = match l1 with [] -> l2 x::l 1 -> x::(concat l 1 l2);; val concat : a list -> a list -> a list = <fun>

Cours de Programmation 2

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

Programme Compte bancaire (code)

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

Module.NET 3 Les Assemblys.NET

TP1 : Initiation à Java et Eclipse

PROJET 1 : BASE DE DONNÉES REPARTIES

Transcription:

Licence Sciences, Technologies, Santé Université de Perpignan Via Domitia Semestre 5 (L3) - Mention Mathématiques, Informatique Année universitaire 2012/2013 Programmation Orientée Objet Introduction à la STL (en C++) et éléments sur les templates Guillaume Revy guillaume.revy@univ-perp.fr Université de Perpignan Via Domitia Guillaume Revy (Univ. de Perpignan Via Domitia) Introduction à la STL (en C++) et éléments sur les templates 1/29

Plan du cours 1. Un transparent sur les templates 2. Standard Template Library (en C++) Introduction Les conteneurs Les itérateurs Quelques algorithmes Guillaume Revy (Univ. de Perpignan Via Domitia) Introduction à la STL (en C++) et éléments sur les templates 2/29

Un transparent sur les templates Plan du cours 1. Un transparent sur les templates 2. Standard Template Library (en C++) Introduction Les conteneurs Les itérateurs Quelques algorithmes Guillaume Revy (Univ. de Perpignan Via Domitia) Introduction à la STL (en C++) et éléments sur les templates 3/29

Un transparent sur les templates Qu est ce que un template? en un transparent... Un template ou patron modèle à partir duquel des classes pourront être générées automatiquement par le compilateur en fonction d une série de paramètres : c est le principe de généricité par exemple : création d une classe paramétrée par le type d un de ses attributs Guillaume Revy (Univ. de Perpignan Via Domitia) Introduction à la STL (en C++) et éléments sur les templates 4/29

Un transparent sur les templates Qu est ce que un template? en un transparent... Un template ou patron modèle à partir duquel des classes pourront être générées automatiquement par le compilateur en fonction d une série de paramètres : c est le principe de généricité par exemple : création d une classe paramétrée par le type d un de ses attributs Exemple : une classe Intervalle, paramétrée par le type de ces bornes template <class T> // la classe Intervalle sera parametree // par le type T de ces elements class Intervalle { T binf, bsup; // declaration de deux objets de type T public: Intervalle ():binf (0),bsup (0) { Intervalle (T binf, T bsup):binf(binf),bsup(bsup){ Intervalle ( Intervalle const& other):binf( other.binf),bsup( other.bsup){ void print(void){ /*... */ ; Guillaume Revy (Univ. de Perpignan Via Domitia) Introduction à la STL (en C++) et éléments sur les templates 4/29

Un transparent sur les templates Qu est ce que un template? en un transparent... Un template ou patron modèle à partir duquel des classes pourront être générées automatiquement par le compilateur en fonction d une série de paramètres : c est le principe de généricité par exemple : création d une classe paramétrée par le type d un de ses attributs Exemple : une classe Intervalle, paramétrée par le type de ces bornes # include <iostream > # include " Intervalle.hpp" int main(void) { Intervalle < int > i1(0,1); Intervalle < int > i2; Intervalle < int > i3(i2); //... return 0; Guillaume Revy (Univ. de Perpignan Via Domitia) Introduction à la STL (en C++) et éléments sur les templates 4/29

Plan du cours 1. Un transparent sur les templates 2. Standard Template Library (en C++) Introduction Les conteneurs Les itérateurs Quelques algorithmes Guillaume Revy (Univ. de Perpignan Via Domitia) Introduction à la STL (en C++) et éléments sur les templates 5/29

Introduction Qu est ce que la STL? La STL est une partie importante de la bibliothèque standard du C++ http://www.sgi.com/tech/stl/ développée par Hewlett-Packard puis Silicon Graphics 1994 : adoptée par le comité de standardisation du C++, pour être intégrée au langage attention : l amalgame est souvent fait entre STL et bibliothèque standard du C++ Plus particulièrement, la bibliothèque standard du C++ est formée de trois grandes composantes : la STL Standard Template Library, les autres outils de la bibliothèque standard du C++ : chaînes de caractères (string), flux d entrée/sortie (std::cin et std::cout),..., et les bibliothèques du langage C. Guillaume Revy (Univ. de Perpignan Via Domitia) Introduction à la STL (en C++) et éléments sur les templates 6/29

Introduction Qu est ce que la STL? La STL propose un grand nombre d éléments ensemble d objets et de méthodes standards pour le C++ des structures de données évoluées (tableaux, listes chaînées, vecteurs, piles,...), des algorithmes efficaces sur ces structures de données (ajout, recherche, parcours, suppression,...). Guillaume Revy (Univ. de Perpignan Via Domitia) Introduction à la STL (en C++) et éléments sur les templates 7/29

Introduction Qu est ce que la STL? La STL propose un grand nombre d éléments ensemble d objets et de méthodes standards pour le C++ des structures de données évoluées (tableaux, listes chaînées, vecteurs, piles,...), des algorithmes efficaces sur ces structures de données (ajout, recherche, parcours, suppression,...). Plus particulièrement, la STL propose principalement trois types d éléments : les conteneurs (containers) de base ou évolués (adaptators) pour stocker les données (vecteur, listes,...), les itérateurs (iterators) pour parcourir les conteneurs, les algorithmes travaillent sur les conteneurs via les itérateurs. Guillaume Revy (Univ. de Perpignan Via Domitia) Introduction à la STL (en C++) et éléments sur les templates 7/29

Introduction La STL en un transparent Remarque : la bibliothèque standard du C++ contient 51 fichiers d entête, dont 13 appartiennent à la STL # include <algorithm > // algorithmes utiles (tri,...) # include <deque > // tableaux dynamiques ( extensibles a chaque extremite ) # include <functional > // objets fonctions predefinis ( unary_function,...) # include <iterator > // iterateurs, fonctions, adaptateurs # include <list > // listes doublement chainee # include <map > // maps et multimaps # include <numeric > // fonctions numeriques : accumulation,... # include <queue > // files # include <set > // ensembles # include <stack > // piles # include <string > // chaines de caracteres # include <utility > // divers utilitaires # include <vector > // vecteurs Guillaume Revy (Univ. de Perpignan Via Domitia) Introduction à la STL (en C++) et éléments sur les templates 8/29

Les conteneurs Les conteneurs de la STL Les conteneurs sont des structures de données abstraites, permettant de contenir des données ( autres objets). paramètrés par le type des éléments qu ils contiennent Les principaux conteneurs de la STL sont : les paires pair les vecteurs ( tableaux) vector les listes doublement chaînées list les tableaux dynamiques deque les ensembles ordonnés (au sens mathématique) set les tables associatives ordonnées ( tableaux pouvant être indexés par autre chose que des entiers, comme des chaînes de caractères) map les piles (structure LIFO) stack les files (structure FIFO) queue Guillaume Revy (Univ. de Perpignan Via Domitia) Introduction à la STL (en C++) et éléments sur les templates 9/29

Les conteneurs Les conteneurs de la STL Les conteneurs sont des structures de données abstraites, permettant de contenir des données ( autres objets). paramètrés par le type des éléments qu ils contiennent Les principaux conteneurs de la STL sont : les paires pair conteneur simple les vecteurs ( tableaux) vector conteneur séquentiel les listes doublement chaînées list conteneur séquentiel les tableaux dynamiques deque conteneur séquentiel les ensembles ordonnés (au sens mathématique) set conteneur associatif les tables associatives ordonnées ( tableaux pouvant être indexés par autre chose que des entiers, comme des chaînes de caractères) map conteneur associatif les piles (structure LIFO) stack adaptateur de conteneur les files (structure FIFO) queue adaptateur de conteneur Guillaume Revy (Univ. de Perpignan Via Domitia) Introduction à la STL (en C++) et éléments sur les templates 9/29

Les conteneurs Les conteneurs de la STL Sur tous les conteneurs, un ensemble de méthodes est défini : empty(), size(), clear(), erase(...), begin()/end(), rbegin()/rend(), opérateurs de comparaison,... Différents types de conteneurs conteneur simple (paire), conteneurs séquentiels stockent les éléments de manière séquentielle, et y accèdent de manière séquentielle ou directement (selon le conteneur) conteneurs associatifs associent une clé à chaque objet stocké, ces clés servant ensuite à accèder efficacement aux objets (éléments ordonnés) adaptateurs de conteneurs spécialisation de conteneurs (par exemple, deque spécialisé en queue ou stack) Guillaume Revy (Univ. de Perpignan Via Domitia) Introduction à la STL (en C++) et éléments sur les templates 10/29

Les conteneurs Quelques complexités avant de commmencer Insertion Suppression Accès Recherche tête qcq queue tête qcq queue tête qcq queue par valeur vector O(n) O(n) O(1) O(n) O(n) O(1) O(1) O(n) deque O(1) O(n) O(1) O(1) O(n) O(1) O(1) O(n) list O(1) O(1) O(1) O(n) O(1) O(n) set/map - O(logn) - - O(logn) - O(1) - O(1) O(logn) Guillaume Revy (Univ. de Perpignan Via Domitia) Introduction à la STL (en C++) et éléments sur les templates 11/29

Les conteneurs Exemple de conteneurs les vecteurs # include <iostream > # include <vector > // <-- utilisation des vecteurs using namespace std; int main(void) { vector < int > v1; // declaration d un vecteur d entiers vide v1 vector < int > v2 (8); // declaration d un vecteur de 8 cases non initialisees vector < int > v3 (8,17); // declaration d un vecteur de 8 cases initialisees a 17 cout << " Taille de v1 : " << v1.size () << endl; // --> Taille de v1 : 0 cout << " Taille de v2 : " << v2.size () << endl; // --> Taille de v2 : 8 cout << " Taille de v3 : " << v2.size () << endl; // --> Taille de v3 : 8 for(int i = 0 ; i < v3.size () ; i++){ cout << "v3.at(" << i << ") : " << v3.at(i); // indexation via la methode at() cout << " ou v3[" << i << "] : " << v3[i] << endl; // indexation via les [] return 0; Attention : le parcours, simple avec les vecteurs via l opérateur [], ne l est pas pour les autres conteneurs passage par les itérateurs. Guillaume Revy (Univ. de Perpignan Via Domitia) Introduction à la STL (en C++) et éléments sur les templates 12/29

Les conteneurs Exemple de conteneurs une matrice avec des vecteurs # include <iostream > # include <vector > // <-- utilisation des vecteurs using namespace std; typedef vector < float > Line; typedef vector < Line > Matrix; int main(void) { Line l(17,0.0); // declaration d une ligne de 17 elements nuls Matrix m(17,l); // declaration d une matrice de 17 lignes // vector < vector < float > > m; // --> necessite d initialiser m "a la main" for(int i = 0 ; i < m.size () ; i++){ for(int j = 0 ; j < m[i]. size () ; j++){ cout << m[i][j] << " "; cout << endl; return 0; Guillaume Revy (Univ. de Perpignan Via Domitia) Introduction à la STL (en C++) et éléments sur les templates 13/29

Les conteneurs Exemple de conteneurs les listes doublement chaînées # include <iostream > # include <list > // <-- utilisation des listes doublement chainees using namespace std; int main(void) { list < int > L; // declaration similaire a celle d un vecteur // mais utilisation differente L. push_back (5); // L = {5 L. push_back (4); // L = {5,4 L. push_front (3); // L = {3,5,4 cout << "Tete de L : " << L. front () << endl; // Tete de L : 3 cout << " Queue de L : " << L.back () << endl; // Queue de L : 4 for(int i = 0 ; i < L.size () ; i++){ cout << "L.at(" << i << ") : " << L.at(i); cout << "L[" << i << "] : " << L[i] << endl; return 0; // ERREUR // ERREUR Guillaume Revy (Univ. de Perpignan Via Domitia) Introduction à la STL (en C++) et éléments sur les templates 14/29

Les conteneurs Exemple de conteneurs les listes doublement chaînées int main(void) { list < int > L; // declaration similaire a celle d un vecteur // mais utilisation differente L. push_back (5); // L = {5 L. push_back (4); // L = {5,4 L. push_front (3); // L = {3,5,4 cout << "Tete de L : " << L. front () << endl; // Tete de L : 3 cout << " Queue de L : " << L.back () << endl; // Queue de L : 4 for(int i = 0 ; i < L.size () ; i++){ cout << "L.at(" << i << ") : " << L.at(i); cout << "L[" << i << "] : " << L[i] << endl; return 0; Remarques // ERREUR // ERREUR la méthode push_back est également définie sur les vecteurs par contre, pour les listes, l indexation via l opérateur [] ou la méthode at(...) n est pas autorisée Guillaume Revy (Univ. de Perpignan Via Domitia) Introduction à la STL (en C++) et éléments sur les templates 14/29

Les conteneurs Exemple de conteneurs utilisation d un conteneur associatif # include <iostream > # include <map > // <-- utilisation des tables associatifs (map) using namespace std; int main(void) { map < string, string > telephones ; // tableau indexe par une // chaine de caracteres telephones ["Nom1"] = " 0132655698 "; telephones ["Nom2"] = " 0686423657 "; cout << "Nom1 -> " << telephones ["Nom1"] << endl; cout << "Nom2 -> " << telephones ["Nom2"] << endl; return 0; Guillaume Revy (Univ. de Perpignan Via Domitia) Introduction à la STL (en C++) et éléments sur les templates 15/29

Les conteneurs Exemple de conteneurs utilisation d un conteneur associatif # include <iostream > # include <map > // <-- utilisation des tables associatifs (map) using namespace std; int main(void) { map < string, string > telephones ; // tableau indexe par une // chaine de caracteres telephones ["Nom1"] = " 0132655698 "; telephones ["Nom2"] = " 0686423657 "; cout << "Nom1 -> " << telephones ["Nom1"] << endl; cout << "Nom2 -> " << telephones ["Nom2"] << endl; return 0; Nom1 -> 0132655698 Nom2 -> 0686423657 Guillaume Revy (Univ. de Perpignan Via Domitia) Introduction à la STL (en C++) et éléments sur les templates 15/29

Les itérateurs Qu est ce qu un itérateur? Les itérateurs sont des objets fondamentaux de la STL ils permettent de manipuler les conteneurs de manière transparente, plus facilement Un itérateur permet : de parcourir un conteneur, d accéder aux données contenues dans le conteneur, et (éventuellement) de modifier les données. Un itérateur peut être vu comme un pointeur sur un élément du conteneur. Il existe deux types d itérateurs : iterator ou const_iterator parcours d un conteneur du début à la fin reverse_iterator ou const_reverse_iterator parcours d un conteneur en sens inverse (de la fin au début) Guillaume Revy (Univ. de Perpignan Via Domitia) Introduction à la STL (en C++) et éléments sur les templates 16/29

Les itérateurs Utilisation générale d un itérateur Un itérateur associé à un conteneur C (vecteur, liste,...) se déclare de la manière suivante. C:: iterator it1; C:: reverse_iterator it2; Un itérateur iterator peut être initialisé grâce aux méthodes : begin() retourne un itérateur pointant sur le premier élément du conteneur end() retourne un itérateur pointant sur l élément juste après le dernier élément du conteneur ou toutes autres méthodes retournant un itérateur sur le conteneur : find(),... end() 0 1 2 3 7 17 17 17 17 17 begin() Guillaume Revy (Univ. de Perpignan Via Domitia) Introduction à la STL (en C++) et éléments sur les templates 17/29

Les itérateurs Utilisation générale d un itérateur Un itérateur associé à un conteneur C (vecteur, liste,...) se déclare de la manière suivante. C:: iterator it1; C:: reverse_iterator it2; Un itérateur iterator peut être initialisé grâce aux méthodes : begin() retourne un itérateur pointant sur le premier élément du conteneur end() retourne un itérateur pointant sur l élément juste après le dernier élément du conteneur ou toutes autres méthodes retournant un itérateur sur le conteneur : find(),... De manière similaire, un itérateur reverse_iterator peut être initialisé en utilisant les méthodes : rbegin()/rend(),... Accéder à l élément pointé par un itérateur it se fait de la même manière que pour accéder á l élément pointé par un pointeur *it Guillaume Revy (Univ. de Perpignan Via Domitia) Introduction à la STL (en C++) et éléments sur les templates 17/29

Les itérateurs Exemple d utilisation d un itérateur pour le parcours d un vecteur # include <iostream > # include <vector > // <-- utilisation des vecteurs using namespace std; int main(void) { vector < int > v1; // declaration d un vecteur d entiers vide v1 vector < int > v2 (8); // declaration d un vecteur de 8 cases non initialisees vector < int > v3 (8,17); // declaration d un vecteur de 8 cases initialisees a 17 cout << " Taille de v1 : " << v1.size () << endl; // --> Taille de v1 : 0 cout << " Taille de v2 : " << v2.size () << endl; // --> Taille de v2 : 8 cout << " Taille de v3 : " << v2.size () << endl; // --> Taille de v3 : 8 for(int i = 0 ; i < v3.size () ; i++){ cout << "v3.at(" << i << ") : " << v3.at(i); // indexation via la methode at() cout << " ou v3[" << i << "] : " << v3[i] << endl; // indexation via les [] return 0; Guillaume Revy (Univ. de Perpignan Via Domitia) Introduction à la STL (en C++) et éléments sur les templates 18/29

Les itérateurs Exemple d utilisation d un itérateur pour le parcours d un vecteur # include <iostream > # include <vector > // <-- utilisation des vecteurs using namespace std; int main(void) { vector < int > v1 (8); // declaration d un vecteur de 8 cases non initialisees vector < int >:: iterator it1; vector < int >:: reverse_iterator it2; int idx = 0; // --> initialisation du debut a la fin du vecteur for(it1 = v1. begin () ; it1!= v1.end () ; it1 ++) (* it1) = (idx++); // affectation de (idx++) a l element pointe par it1, // c est -a-dire, a v1[idx] // --> parcours dans le sens inverse for(it2 = v1. rbegin () ; it2!= v1.rend (); it2 ++) cout << "v1[" << idx -- << "] = " << (* it2) << endl; return 0; // affichage de l element // pointe par it2 Guillaume Revy (Univ. de Perpignan Via Domitia) Introduction à la STL (en C++) et éléments sur les templates 18/29

Les itérateurs Exemple d utilisation d un itérateur affichage de la matrice # include <iostream > # include <vector > // <-- utilisation des vecteurs using namespace std; typedef vector < float > Line; typedef vector < Line > Matrix; int main(void) { Line l(17,0.0); // declaration d une ligne de 17 elements nuls Matrix m(17,l); // declaration d une matrice de 17 lignes Matrix :: iterator i; Line :: iterator j; for(i = m. begin () ; i!= m.end () ; i++){ for(j = (*i).begin () ; j!= (*i).end () ; j++) cout << (*j) << " "; cout << endl; return 0; Guillaume Revy (Univ. de Perpignan Via Domitia) Introduction à la STL (en C++) et éléments sur les templates 19/29

Les itérateurs Exemple d utilisation d un itérateur les listes doublement chaînées # include <iostream > # include <list > // <-- utilisation des listes doublement chainees using namespace std; int main(void) { list < int > L; // declaration similaire a celle d un vecteur // mais utilisation differente L. push_back (5); // L = {5 L. push_back (4); // L = {5,4 L. push_front (3); // L = {3,5,4 cout << "Tete de L : " << L. front () << endl; // Tete de L : 3 cout << " Queue de L : " << L.back () << endl; // Queue de L : 4 for(int i = 0 ; i < L.size () ; i++){ cout << "L.at(" << i << ") : " << L.at(i); cout << "L[" << i << "] : " << L[i] << endl; return 0; // ERREUR // ERREUR Guillaume Revy (Univ. de Perpignan Via Domitia) Introduction à la STL (en C++) et éléments sur les templates 20/29

Les itérateurs Exemple d utilisation d un itérateur les listes doublement chaînées int main(void) { list < int > L; // declaration similaire a celle d un vecteur // mais utilisation differente L. push_back (5); // L = {5 L. push_back (4); // L = {5,4 L. push_front (3); // L = {3,5,4 cout << "Tete de L : " << L. front () << endl; // Tete de L : 3 cout << " Queue de L : " << L.back () << endl; // Queue de L : 4 int idx = 0; list < int >:: iterator it1; list < int >:: reverse_iterator it2; for(it1 = L. begin () ; it1!= L.end () ; it1 ++) cout << "L(" << (idx ++) << ") : " << (* it1) << endl; // --> 3, 5, 4 for(it2 = L. rbegin () ; it2!= L.rend () ; it2 ++) cout << "L(" << (idx ++) << ") : " << (* it2) << endl; // --> 4, 5, 3 return 0; // OK // OK Guillaume Revy (Univ. de Perpignan Via Domitia) Introduction à la STL (en C++) et éléments sur les templates 20/29

Les itérateurs Exemple d utilisation d un itérateur les tableaux associatifs (map) # include <iostream > # include <map > // <-- utilisation des tables associatifs (map) using namespace std; int main(void) { map < string, string > telephones ; // tableau indexe par une // chaine de caracteres telephones ["Nom1"] = " 0132655698 "; telephones ["Nom2"] = " 0686423657 "; telephones ["Nom3"] = " 0682749823 "; telephones ["Nom4"] = " 0221331090 "; map < string, string >:: iterator it; for(it = telephones. begin () ; it!= telephones.end () ; it ++) // it pointe sur une paire : // - premier element : it ->first ou (* it). first // - second element : it ->second ou (* it). second cout << it ->first << " -> " << (* it). second << endl; return 0; Guillaume Revy (Univ. de Perpignan Via Domitia) Introduction à la STL (en C++) et éléments sur les templates 21/29

Les itérateurs Exemple d utilisation d un itérateur recherche et suppresssion dans un tableau associatif (map) // --> recherche du numero de "Nom1" string nom("nom5"); it = telephones.find(nom); if(it == telephones.end ()) cout << "Error : \"" << nom << "\" not found..." << endl; else cout << "Error : \"" << nom << "\" found..." << endl; nom = "Nom1"; it = telephones.find(nom); if(it == telephones.end ()) cout << "Error : \"" << nom << "\" not found..." << endl; else cout << "Error : \"" << nom << "\" not..." << endl; // --> suppression de l entree indexee par "Nom1" telephones. erase(it); for(it = telephones. begin () ; it!= telephones.end () ; it ++) cout << it ->first << " -> " << (* it). second << endl; Error : "Nom5" not found... Error : "Nom1" not... Nom2 -> 0686423657 Nom3 -> 0682749823 Nom4 -> 0221331090 Guillaume Revy (Univ. de Perpignan Via Domitia) Introduction à la STL (en C++) et éléments sur les templates 22/29

Quelques algorithmes Les algorithmes de la STL Finalement, la STL offre un ensemble d algorithmes utilisables sur les conteneurs, via les itérateurs. Les principaux algorithmes sont : les algorithmes numériques minimum, maximum, sommes partielles, accumulations, produits,...), les algorithmes de tri quick-sort,..., les algorithmes modifiant les conteneurs remplissage, copie, échanges, union, intersection,..., les algorithmes ne modifiant pas les conteneurs recherche, applications de fonctions, inclusion,... Guillaume Revy (Univ. de Perpignan Via Domitia) Introduction à la STL (en C++) et éléments sur les templates 23/29

Quelques algorithmes Exemple d utilisation d algorithme de la STL sommer les éléments d un vecteur d entiers # include <iostream > # include <vector > // <-- utilisation des vecteurs # include <numeric > // <-- utilisation des algorithmes numeriques using namespace std; int main(void) { vector < int > v1 (8); // declaration d un vecteur de 8 cases non initialisees vector < int >:: iterator it1; int idx = 1; // --> initialisation du debut a la fin du vecteur for(it1 = v1. begin () ; it1!= v1.end () ; it1 ++) (* it1) = (idx ++); // --> calcule de la somme des elements : 1 + 2 +... + 8 int sum = accumulate (v1. begin (), v1.end (), 0); cout << "Sum : " << sum << endl; return 0; Guillaume Revy (Univ. de Perpignan Via Domitia) Introduction à la STL (en C++) et éléments sur les templates 24/29

Quelques algorithmes Exemple d utilisation d algorithme de la STL trier les éléments d un vecteur d entiers //... # include <algorithm > // <-- utilisation des algorithmes de tri int main(void) { vector < int > v1 (8); // declaration d un vecteur de 8 cases non initialisees vector < int >:: iterator it1; // --> initialisation du debut a la fin du vecteur for(it1 = v1. begin () ; it1!= v1.end () ; it1 ++) (* it1) = rand () %101; // --> affichage des elements du vecteur for(it1 = v1. begin () ; it1!= v1.end (); it1 ++) cout << (* it1) << " "; cout << endl; // 32 32 54 12 52 56 8 30 // --> tri des elements du vecteur sort(v1.begin (), v1.end ()); // --> affichage des elements du vecteur trie for(it1 = v1. begin () ; it1!= v1.end (); it1 ++) cout << (* it1) << " "; cout << endl; // 8 12 30 32 32 52 54 56 return 0; Guillaume Revy (Univ. de Perpignan Via Domitia) Introduction à la STL (en C++) et éléments sur les templates 25/29

Quelques algorithmes Exemple d utilisation d algorithme de la STL faire l union des éléments de deux vecteurs d entiers //... # include <algorithm > // <-- utilisation de l union # include <iterator > // <-- ostream_iterator int main(void) { vector < int > v1 (4), v2 (4); // declaration de deux vecteurs de 4 cases non // initialisees vector < int >:: iterator it1; // --> initialisation des deux vecteurs for(it1 = v1. begin () ; it1!= v1.end () ; it1 ++) (* it1) = rand () %101; for(it1 = v2. begin () ; it1!= v2.end () ; it1 ++) (* it1) = rand () %101; // --> affichage des elements des vecteurs for(it1 = v1. begin () ; it1!= v1.end (); it1 ++) cout << (* it1) << " "; cout << endl; // 32 32 54 12 for(it1 = v2. begin () ; it1!= v2.end (); it1 ++) cout << (* it1) << " "; cout << endl; // 52 56 8 30 // --> affichage de l union des deux vecteurs set_union (v1. begin (), v1.end (), v2. begin (), v2.end (), ostream_iterator <int >( cout, " ")); // 32 32 52 54 12 56 8 30 return 0; Guillaume Revy (Univ. de Perpignan Via Domitia) Introduction à la STL (en C++) et éléments sur les templates 26/29

Quelques algorithmes Exemple d utilisation d algorithme de la STL recherche d un élément dans un vecteur //... # include <algorithm > // <-- utilisation des algorithmes de recherche int main(void) { vector < int > v1 (8); // declaration d un vecteur de 8 cases non initialisees vector < int >:: iterator it1; int idx = 0; // --> initialisation du debut a la fin du vecteur for(it1 = v1. begin () ; it1!= v1.end () ; it1 ++) (* it1) = (idx ++); vector < int >:: iterator it; // --> recherche du numero 7 it = find(v1. begin (), v1.end (), 7); if(it == v1.end ()) cout << " Error : 7 not found..." << endl; else cout << " Error : 7 found..." << endl; // Error : 7 found... return 0; Guillaume Revy (Univ. de Perpignan Via Domitia) Introduction à la STL (en C++) et éléments sur les templates 27/29

Quelques algorithmes Ce cours est une brève introduction à la STL, et de son efficacité... Je vous conseille d aller voir par vous même à l adresse suivante pour en savoir plus! http://www.sgi.com/tech/stl/ Guillaume Revy (Univ. de Perpignan Via Domitia) Introduction à la STL (en C++) et éléments sur les templates 28/29

Questions? Guillaume Revy (Univ. de Perpignan Via Domitia) Introduction à la STL (en C++) et éléments sur les templates 29/29