16
La programmation générique avec la STL EIUMLV - Informatique et Réseaux 99 Benoît ROMAND

La programmation générique avec la STL

  • Upload
    venice

  • View
    32

  • Download
    6

Embed Size (px)

DESCRIPTION

La programmation générique avec la STL. EIUMLV - Informatique et Réseaux 99. Benoît ROMAND. Ce dont on va parler:. Les concepts de généricité : re-encore à nouveau un autre rappel, mais ça finira par rentrer! La Standard Template Library - PowerPoint PPT Presentation

Citation preview

Page 1: La programmation générique avec la STL

La programmation génériqueavec la STL

EIUMLV - Informatique et Réseaux 99Benoît ROMAND

Page 2: La programmation générique avec la STL

Ce dont on va parler:

• Les concepts de généricité : re-encore à nouveau un autre rappel, mais ça finira par rentrer!

• La Standard Template Library

avec les concepts, des exemples, et tout ce qui va bien

• Enfin:les trucs qu’il faut comprendre ( ou en tout cas retenir ) pour le projet

Page 3: La programmation générique avec la STL

Programmation générique: les motivations

• La principale: la flemme

• La réutilisation du code ( cf. premier point )

• La facilité d’écriture

• La lisibilité du code

• …

Page 4: La programmation générique avec la STL

The schéma, par Stepanov et Lee

• Les algorithmes sont indépendants du type de données stockées

• Il s’agit ainsi de connecter des algorithmes à des structures de données, par le biais de connecteurs.

Algorithmes ContainersItérateurs

Page 5: La programmation générique avec la STL

La STL

• Application directe des concepts développés par Stepanov

• Il s’agit d’une bibliothèque d’algorithmes généraux et de structures de données:

Des containers

- de séquence

- associatifs

Des algorithmes

- sort, find, search, …

- copy, swap, for_each, …

Des itérateurs

adaptés aux types de container

Page 6: La programmation générique avec la STL

STL - Les containers de séquence

• Vector- extensible et relocalisable- accès aléatoire par index en O(1)- insertions et retraits à la fin en O(1)- insertions et retraits lents au milieu

• List ( liste circulaire doublement chaînée )- insertions et retraits n’importe où en O(1)- accès au début et à la fin en O(1)- accès lent aux autres éléments

• Deque ( Double Ended Queue = tampon circulaire dynamique )- exactement pareil que Vector pour la complexité- pas d’insertion au milieu- bon compromis vitesse d’accès / souplesse du

remplissage

Page 7: La programmation générique avec la STL

STL - Les containers associatifs

• Set ( liste triée )

- Chaque élément doit être unique ( pas de doublons )

- accès aléatoire par clé ( l’objet lui-même est la clé )• Multiset

- Un ‘set’ qui permet les doublons

• Map ( association clé / élément )

- une clé pour un élément ( pas de doublons )

- accès aléatoire par clé• Mulimap

- Un ‘map’ ou les éléments peuvent être multiples pour une clé

Page 8: La programmation générique avec la STL

STL – Les itérateurs

• L'itérateur est une généralisation des pointeurs. . Il permet de parcourir en séquence les éléments d'un conteneur.

• Hiérarchie des itérateurs:

EcritureLecture

Forward

Bidirectionnel

Accèsaléatoire It+n, It-n

It++, It--

It++

Page 9: La programmation générique avec la STL

STL – petits exemples (1)La copie

void main()

{

list<int> l(4,0); // l vaut 0::0::0::0::[]

vector<int> v(10,1); // v vaut [1,1,1,1,1,1,1,1,1,1,1]

vector<int>::iterator i = copy(l.begin(),l.end(),v.begin());

copy(v.begin(),i, ostream_iterator<int>(cout," "));

copy(i,v.end(), ostream_iterator<int>(cout," "));

}

Page 10: La programmation générique avec la STL

STL – petits exemples (2)Le tri#include <iostream>

#include <list>

#include<algorithm>

List<char> initC(char*c)

{

List<char> majax;

while (*c != ‘\0’= majax.push_back(*c++);

return majax;

}

void main()

{

List<char> gerard = initC("le plus grand et le plus fort des magiciens");

gerard.sort();

gerard.unique();

for (List<char>::iterator i = gerard.begin() ; i != gerard.end() ; i++) cout << *i;

}

Page 11: La programmation générique avec la STL

STL – Autre notion : l’adaptateur (1)

• Adaptateur de container

Pour résumer :

Adaptateur < Conteneur < Truc > >

• Stack ( la pile )

Peut être implémentée avec Vector, List, Deque

Principe LIFO : push et pop à la même extrémité• Queue ( la file )

Peut être implémentée avec List, Deque

Principe FIFO• Priority_queue ( la file par priorité )

Dépend d’une fonction de comparaison:

priority_queue< Conteneur < Truc > , fcomp < Truc > >

Page 12: La programmation générique avec la STL

STL – Autre notion : l’adaptateur (2)

void main()

{

int arr[] = {1,4,9,16,25};

list<int> liste(arr, arr+5);

list<int>::reverse_iterator revit;

revit = liste.rbegin();

while (revit != liste.rend()) cout << *revit++;

}

• Adaptateurs d’itérateursAdaptateurs d’itérateurs

• L’itérateur inverseL’itérateur inverse

Page 13: La programmation générique avec la STL

STL – Autre notion : l’adaptateur (3)

void main(){int t1[] = { 1, 3, 5, 7, 9};deque<int> dq1(t1,t1+5);int t2[] = { 2, 4, 6};deque<int> dq2(t2,t2+3);

copy(dq1.begin(), dq1.end(), back_inserter(dq2));for (int i=0 ; i<dq2.size() ; i++) cout << dq2[i] << ‘ ‘;}

• L’itérateur d’insertionL’itérateur d’insertion

Page 14: La programmation générique avec la STL

STL – pour finir : les foncteurs

• Abstraction de la notion de fonction.• Foncteur = Objet dont la classe définit l’opérateur () , appelé

opérateur de fonction• Permettent d’appliquer des fonctions sur les objets manipulés#include <iostream>#include <functional>

template <class T, class F> T applique(T i, T j, F foncteur){return foncteur(i, j);}

void main(void){plus<int> foncteur_plus;cout << applique(2, 3, foncteur_plus) << endl;}

Page 15: La programmation générique avec la STL

La suite sur le site Web …

Page 16: La programmation générique avec la STL

Parlons voir de Ookce…

• 1 : les concepts de généricité ne s’appliquent pas seulement au c++…

• 2 : on a le droit de les appliquer

• 3 : le joli schéma de Stepanov peut être généralisé : on sait à quoi ressemble l’objet avec lequel on veut discuter et ce qu’il doit faire, mais on ne sait pas comment il fait ce qu’il fait ( et on plus ce n’est pas notre problème )

En gros, si l’objet cible change, on lui demande simplement de garder la même apparence. Comme ça, on n’a pas besoin de recommencer tout notre code

• 4 : c’est très chiant au début, mais ça facilite la vie après