Bibliothèque#standard#C++#duhamel/C++/stl.pdf · A.#&#C.#Duhamel# B.#Garcia## D.#Hill# L.#Yon#...

9
A. & C. Duhamel B. Garcia D. Hill L. Yon Bibliothèque standard C++ ISIMA A ZZ2 A 2012 1 • Présence récurrente en développement des mêmes • structures de données : vecteur, pile, file, ensemble… • algorithmes : chercher, trier, insérer, extraire… • Éviter de réinventer la roue • temps perdu (codage, débogage, opTmisaTon) • uTliser l’existant (bibliothèques) • Tous les langages modernes ont une bibliothèque • java, C#, perl, python • C++ 2 IntroducTon • Fiabilité : collecTon de classes largement uTlisées • Portabilité : standard, totalement en C++ • Efficacité : uTlisaTon intensive de la généricité et des structures de données opTmisées pour garanTr les meilleures performances • Compréhensibilité : toutes les classes suivent les mêmes convenTons d’uTlisaTon 3 Pourquoi uTliser la bibliothèque standard ? • C standard • Classes de base : string, excepTon, flux • Mais aussi : traits, auto_ptr • Conteneurs et itérateurs • Algorithmes et foncteurs 4 Contenu STL

Transcript of Bibliothèque#standard#C++#duhamel/C++/stl.pdf · A.#&#C.#Duhamel# B.#Garcia## D.#Hill# L.#Yon#...

Page 1: Bibliothèque#standard#C++#duhamel/C++/stl.pdf · A.#&#C.#Duhamel# B.#Garcia## D.#Hill# L.#Yon# Bibliothèque#standard#C++# ISIMA#A#ZZ2#A#2012# 1 • Présence#récurrente#en#développement#des#mêmes#

A.#&#C.#Duhamel#

B.#Garcia##

D.#Hill#

L.#Yon#

Bibliothèque#standard#C++#

ISIMA#A#ZZ2#A#2012#

1

•  Présence#récurrente#en#développement#des#mêmes#

•  structures#de#données#:#vecteur,#pile,#file,#ensemble…#

•  algorithmes#:#chercher,#trier,#insérer,#extraire…#

•  Éviter#de#réinventer#la#roue#•  temps#perdu#(codage,#débogage,#opTmisaTon)#

•  uTliser#l’existant#(bibliothèques)#

•  Tous#les#langages#modernes#ont#une#bibliothèque#

•  java,#C#,#perl,#python#•  C++#

2

IntroducTon#

•  Fiabilité#:#collecTon#de#classes#largement#uTlisées#

•  Portabilité#:#standard,#totalement#en#C++#

•  Efficacité#:#uTlisaTon#intensive#de#la#généricité#et#des#

structures#de#données#opTmisées#pour#garanTr#les#

meilleures#performances#

•  Compréhensibilité#:#toutes#les#classes#suivent#les#

mêmes#convenTons#d’uTlisaTon#

3

Pourquoi#uTliser#la#bibliothèque#standard#?#

•  C#standard#•  Classes#de#base#:#string,#excepTon,#flux#•  Mais#aussi#:#traits,#auto_ptr#

•  Conteneurs#et#itérateurs#•  Algorithmes#et#foncteurs#

4

Contenu#

STL#

Page 2: Bibliothèque#standard#C++#duhamel/C++/stl.pdf · A.#&#C.#Duhamel# B.#Garcia## D.#Hill# L.#Yon# Bibliothèque#standard#C++# ISIMA#A#ZZ2#A#2012# 1 • Présence#récurrente#en#développement#des#mêmes#

•  DéclaraTons#et#iniTalisaTons#•  Lire#des#enTers#•  Trier#la#saisie##•  Afficher#la#liste#

•  Conteneur#•  Contenir#des#objets##

•  Itérateur#•  Parcourir#un#conteneur##•  Début,#fin#élément#courant,#passer#à#élément#suivant#

5

Exemple#

6

Exemple#1#

#include <cstdlib>

#include <iostream>

using namespace std;

inline int cmp (const void *a, const void *b)

{

int aa = *(int *)a;

int bb = *(int *)b;

return (aa < bb) ? -1 : (aa > bb) ? 1 : 0;

}

int main (int, char **)

{

const int size = 1000;

int array [size];

int n = 0;

while (cin >> array[n++]);

--n;

qsort (array, n, sizeof(int), cmp);

for (int i = 0; i < n; i++)

cout << array[i] << "\n";

}

// Exemple inspiré de http://www.cs.brown.edu/people/jak/proglang/cpp/stltut/tut.html

Exemple#en#C/C++#

#include <algorithm>

#include <vector>

#include <iostream>

using namespace std;

int main (int, char **)

{

vector<int> v;

int input;

while (cin >> input)

v.push_back (input);

sort(v.begin(), v.end());

int n = v.size();

for (int i = 0; i < n; i++)

cout << v[i] << "\n";

} 7

#include <algorithm>

#include <vector>

#include <iostream>

#include <iterator>

using namespace std;

int main (int, char **)

{

vector<int> v;

int input;

while (cin >> input)

v.push_back (input);

sort(v.begin(), v.end());

copy (v.begin(), v.end(),

ostream_iterator<int> (cout, "\n"));

} 8

Page 3: Bibliothèque#standard#C++#duhamel/C++/stl.pdf · A.#&#C.#Duhamel# B.#Garcia## D.#Hill# L.#Yon# Bibliothèque#standard#C++# ISIMA#A#ZZ2#A#2012# 1 • Présence#récurrente#en#développement#des#mêmes#

#include <algorithm>

#include <vector>

#include <iostream>

#include <iterator>

using namespace std;

int main (int, char **)

{

vector<int> v;

istream_iterator<int> start (cin);

istream_iterator<int> end;

back_insert_iterator<vector<int> > dest (v);

copy (start, end, dest);

sort(v.begin(), v.end());

copy (v.begin(), v.end(), ostream_iterator<int>(cout, "\n"));

} 9

•  Classe#chaîne#de#caractères#:#string •  gesTon#automaTque#de#la#mémoire#(FNC)#

•  surcharge#des#opérateurs#classiques#(+,#<<)#•  définie#dans#le#namespace#std,#header#<string> •  uTlisaTon#

→ uTliser#le#plus#possible#string#à#la#place#de#char *

10

Classes#uTlitaires#de#la#STL#

#include <string> … std::string str1("chaine lue : "), str2; std::cin >> str2; std::cout << str1 + str2 << std::endl; str2[0] = ‘\0’; st1 += str2; std::cout << str1 << std::endl;

11

#include <iostream>

#include <string>

#include <sstream>

using namespace std;

int main (int, char **)

{ stringstream ss; ss << "annee :" << 2012 << endl; string s = ss.str();

s += ".";

// s.c_str() permet d'accéder au char * interne

clog << s;

}

•  Classe#excepTon#:#exception •  foncTonnalités#de#base#(FNC)#•  méthode#what()#:#renvoie#une#descripTon#(char *)#•  définie#dans#le#namespace#std,#header#<exception> •  définiTon#

→ dériver#les#excepTons#personnelles#de#exception

12

Classes#uTlitaires#de#la#STL#

class exception { public: exception () throw(); exception (const exception& rhs) throw(); exception & operator= (const exception& rhs) throw(); virtual ~exception() throw(); virtual const char * what() const throw(); };

Page 4: Bibliothèque#standard#C++#duhamel/C++/stl.pdf · A.#&#C.#Duhamel# B.#Garcia## D.#Hill# L.#Yon# Bibliothèque#standard#C++# ISIMA#A#ZZ2#A#2012# 1 • Présence#récurrente#en#développement#des#mêmes#

•  Trois#grandes#classes#de#conteneurs#•  séquences#élémentaires#

•  vecteur,#liste#et#file#à#double#entrée#•  adaptaTons#des#séquences#élémentaires#

•  pile,#file#et#file#à#priorité#•  conteneurs#associaTfs#

•  ensemble#avec/sans#unicité#

•  associaTon#avec#clé#unique/mulTple#

•  Remarques#

•  tous#définis#dans#le#namespace#std •  uTlisaTon#intensive#de#la#généricité#(type,#allocaTon…)#

13

Conteneurs#de#la#STL#

•  FoncTonnalités#communes#à#tous#les#conteneurs#

•  Forme#Normale#de#Coplien#

•  dimensionnement#automaTque#de#la#capacité#

•  lorsque#l’inserTon#d’un#élément#viole#la#capacité#

•  doublement#de#la#capacité#

•  permet#une#adaptaTon#rapide#à#la#taille#«#finale#»#

•  quelques#méthodes#

•  int C::size () const // nombre d’éléments •  int C::max_size () const // nombre max •  bool C::empty () const // prédicat de vacuité •  void C::swap (C & cnt) // échange de contenu •  void C::clear () // purge#

14

Conteneurs#de#la#STL#

•  FoncTonnalités#communes#à#toutes#les#séquences#

•  inserTon#•  S::iterator S::insert (S::iterator bef, T & elt) •  S::iterator S::insert (S::iterator bef, int nb, T & elt) •  S::iterator S::insert (S::iterator it, S::const_iterator first, S::const_iterator last)

•  suppression#•  S::iterator S::erase (S::iterator pos) •  S::iterator S::erase (S::const_iterator first, S::const_iterator last)

•  accès#en#bordure#de#la#séquence •  void S::push_back (T & elt) •  void S::pop_back () •  T & S::front () •  const T & S::front () const •  T & S::back () •  const T & S::back () const

15

Séquences#élémentaires#

•  header#:#<vector> •  déclaraTon#:#std::vector<T> v;##•  méthodes#spécifiques#

•  int V::capacity () const •  void V::reserve (int nb)

•  X & V::operator[] (int idx) •  const X & V::operator[] (int idx) const

•  intéressant#par#ses#accès#en#O(1)#•  déconseillé#pour#les#inserTons/suppressions#O(n)#

16

Le#vecteur#

Page 5: Bibliothèque#standard#C++#duhamel/C++/stl.pdf · A.#&#C.#Duhamel# B.#Garcia## D.#Hill# L.#Yon# Bibliothèque#standard#C++# ISIMA#A#ZZ2#A#2012# 1 • Présence#récurrente#en#développement#des#mêmes#

17

Le#vecteur#(Exemple)#

#include <iostream> #include <vector> int main (int, char **) { typedef std::vector<int> ivector; ivector v1; for (int i = 0; i < 4; ++i) v1.push_back(i); ivector v2(4); // taille initiale 4 for (int i = 0; i < 4; ++i) v2[i] = i; std::cout << (v1 == v2) ? “Ok” : “Pas Ok” << std::endl; return 0; }

•  header#:#<list> •  déclaraTon#:#std::list<T> l;#•  méthodes#spécifiques#

•  void L::push_front (const T & elt) •  void L::pop_front ()

•  void L::remove (const T & elt) •  void L::sort () •  void L::sort (Comparator cmp) •  void L::merge(list<T> & l) •  splice, remove_if, unique

•  intéressant#pour#les#inserTons/suppressions#en#O(1)#•  déconseillé#pour#les#accès#directs#en#O(n)#

18

La#liste#

19

La#liste#

#include <iostream> #include <list> int main(int, char **) { typedef std::list<int> ilist; ilist l; for (int i = 0; i < 4; ++i) l.push_back((10 + 3*i) % 5); l.sort(); // 0 1 3 4 l.reverse(); // 4 3 1 0 // affiche le debut et la fin std::cout << l.front() << ' ' << l.back() << std::endl; return 0; }

•  File#à#double#entrée#(vecteur#circulaire)#•  header#:#<deque> •  déclaraTon#:#std::deque<T> d;#•  méthodes#spécifiques#

•  int D::capacity () const •  void D::reserve (int nb) •  void D::push_front (const T & elt) •  void D::pop_front ()

•  X & D::operator[] (int idx) •  const X & D::operator[] (int idx) const

•  tous#les#avantages#de#vector •  gesTon#des#inserTons/suppressions#en#tête#en#O(1)#

20

La#file#à#double#entrée#

Page 6: Bibliothèque#standard#C++#duhamel/C++/stl.pdf · A.#&#C.#Duhamel# B.#Garcia## D.#Hill# L.#Yon# Bibliothèque#standard#C++# ISIMA#A#ZZ2#A#2012# 1 • Présence#récurrente#en#développement#des#mêmes#

21

La#file#à#double#entrée#

#include <iostream> #include <deque> int main(int, char **) { typedef std::deque<int> ideque; ideque v1; for (int i = 0; i < 4; ++i) v1.push_back(i); ideque v2(4); // taille initiale 4 for (int i = 0; i < 4; ++i) v2[i] = i; std::cout << (v1 == v2) ? “Ok” : “Pas Ok” << std::endl; return 0; }

•  Constat#•  souhaite#souvent#parcourir#les#éléments#d’un#conteneur#

•  soluTon#naïve#:#définir#un#pointeur#sur#la#cellule#courante#dans#le#conteneur#•  limite#:#on#ne#peut#pas#avoir#deux#parcours#en#même#temps#

•  soluTon#temporaire#:#sorTr#le#pointeur#du#conteneur#(en#l’encapsulant#!)#

•  souhaite#parfois#avoir#des#parcours#différents#(avant,#arrière…)#•  soluTon#naïve#:#définir#la#stratégie#de#parcours#dans#le#conteneur#•  limite#:#on#ne#peut#avoir#(proprement)#qu’un#seul#type#de#parcours#

•  soluTon#temporaire#:#sorTr#la#stratégie#du#conteneur#(en#l’encapsulant#!)#

•  Itérateur#•  classe#qui#définit#l’accès#à#un#élément#courant#du#conteneur#

•  classe#qui#définit#sa#stratégie#de#parcours#

22

Les#itérateurs#

•  Stratégies#d’accès#et#de#parcours#des#conteneurs#•  chaque#itérateur#définit#sa#propre#stratégie#de#parcours#•  typiquement#un#pointeur#sur#un#élément#du#conteneur#

•  doit#connaître#l’implémentaTon#de#son#conteneur#

•  défini#comme#une#classe#imbriquée#dans#le#conteneur#

•  possibilité#d’avoir#plusieurs#itérateurs#en#même#temps#

•  incompaTbilité#des#itérateurs#de#conteneurs#différents#

23

Les#itérateurs#

class Conteneur { public: … class Iterateur { … }; … };

•  4#types#d’itérateur#par#conteneur#•  conteneur::iterator#•  conteneur::const_iterator#•  conteneur::reverse_iterator#•  conteneur::const_reverse_iterator#

•  Balises#fournies#par#le#conteneur#

•  parcours#premier#→#dernier#:#begin(),#end()#

•  parcours#dernier#→#premier#:#rbegin(),#rend()#24

Les#itérateurs#

begin() end()

rend() rbegin()

… 1 n 2 n-1

Page 7: Bibliothèque#standard#C++#duhamel/C++/stl.pdf · A.#&#C.#Duhamel# B.#Garcia## D.#Hill# L.#Yon# Bibliothèque#standard#C++# ISIMA#A#ZZ2#A#2012# 1 • Présence#récurrente#en#développement#des#mêmes#

•  FoncTonnalités#•  FNC#•  opérateurs#de#comparaison#!=#et#== •  opérateur#de#déréférencement#* •  opérateur#d'incrémentaTon#(pré#et#post)#++

25

Les#itérateurs#

•  UTlisaTon#•  parcours#d’un#conteneur#

•  valeur#de#retour#de#find() •  permet#une#opéraTon#immédiate#sur#l’objet#

•  complexité#de#l’accès#suivant#:#O(1)#

26

Les#itérateurs#

conteneur c; conteneur::iterator it; for (it = c.begin(); it != c.end(); ++it) do_something(*it);

conteneur c; conteneur::iterator it = find(c.begin(), c.end(), elt); do_something(*it);

•  Clé#/#valeur#:#map#

•  Clé#/#Valeurs#:#mulTmap#

•  Clés#comparable#

•  Structure#d’arbre#binaire#

27

Conteneur##associaTf#(1)#

map<string, string> liste; liste.insert(make_pair("loic", "[email protected]")); liste["benny"] = "[email protected]"; // creation par recherche …

Paire#

first#

second#

28

Conteneur##associaTf#(2)#const string& first(const pair<string,string>& p) {return p.first; } int main(int, char**) { map<string, string> liste; map<string, string>::const_iterator it = liste.begin(); while(it!=liste.end()) { cout << it->first << " " << it->second << endl; ++it; } transform(liste.begin(), liste.end(), ostream_iterator<string>(cout, " "), first); return 0; }

Page 8: Bibliothèque#standard#C++#duhamel/C++/stl.pdf · A.#&#C.#Duhamel# B.#Garcia## D.#Hill# L.#Yon# Bibliothèque#standard#C++# ISIMA#A#ZZ2#A#2012# 1 • Présence#récurrente#en#développement#des#mêmes#

•  Constat#•  souhaite#souvent#appliquer#un#algorithme#sur#un#conteneur#

•  soluTon#naïve#:#le#placer#en#méthode#du#conteneur#

•  limite#:#polluTon#de#l’API#du#conteneur#

•  soluTon#:#placer#les#algorithmes#dans#des#classes#dédiées#

•  souhaite#parfois#avoir#plusieurs#versions#de#l’algorithme#

•  soluTon#naïve#:#uTliser#la#surcharge#(polymorphisme#faible)#

•  limite#:#on#n’est#pas#sûr#d’appeler#la#bonne#version#

•  soluTon#:#uTliser#l’héritage#

•  Foncteur#•  classe#qui#implémente#un#algorithme#sur#le#conteneur#

•  une#sousAclasse#par#variante#•  accès#aux#éléments#du#conteneur#par#les#itérateurs# 29

Les#foncteurs#

•  Combinaison#de#deux#principes#

•  surcharge#de#l’opérateur#() •  arité#spécifiée#par#le#concepteur#•  syntaxe#:#type_retour A::operator() (paramètres) •  intérêt#:#un#objet#se#comporte#comme#une#foncTon#

•  note#:#peut#aussi#être#uTlisé#pour#remplacer#l’opérateur#[]

•  l’algorithme#souhaité#est#implémenté#dans#l’opérateur#() •  les#arguments#de#l’algorithme#sont#placés#en#argument#

30

Les#foncteurs#

•  principe#•  pas#d’état#interne#•  opérateur#()#prenant#les#deux#objets#à#comparer#

31

Les#foncteurs#:#comparateur#

class Comparator

{

public:

Comparator () {}

bool operator() (const A & a1, const A & a2) const

{return (a1.val() < a2.val());}

};

Comparator cmp;

A a1, a2;

std::cout << cmp(a1,a2) << std::endl;

•  ManipulaTon#globale#du#conteneur#

•  trois#enTtés#•  un#conteneur#pour#le#stockage#des#objets#•  des#itérateurs#pour#les#accès#aux#objets#•  des#algorithmes#pour#la#manipulaTon#des#objets#

•  foncTonnement#conjoint#

•  les#algorithmes#opèrent#sur#le#conteneur#via#les#itérateurs#

32

Les#foncteurs#

conteneur algorithme itérateurs

Page 9: Bibliothèque#standard#C++#duhamel/C++/stl.pdf · A.#&#C.#Duhamel# B.#Garcia## D.#Hill# L.#Yon# Bibliothèque#standard#C++# ISIMA#A#ZZ2#A#2012# 1 • Présence#récurrente#en#développement#des#mêmes#

•  Principe#•  état#interne#conservé#par#les#atributs#•  opérateur#()#sans#paramètres#pour#la#généraTon#des#

nombres#

•  generate()#

33

Les#foncteurs#:#générateur#de#nombres#pairs#

class GenPair

{

protected:

unsigned val;

public:

GenPair () {val = 0;}

unsigned operator() (void) {val += 2; return val;}

};

GenPair gen;

std::cout << gen() << ‘ ‘ << gen() << std::endl; // affiche 2 4 34

GenPair gen; vector<int> v(10); generate(v.begin(), v.end(), gp); copy(v.begin(), v.end(), ostream_iterator<int>(cout, " "));

35

Pour#aller#plus#loin#:#la#bibliothèque#boost#

•  Super#mémento##

htp://www.medini.org/download/stlqr/1.32/stlqrAa4.pdf##

•  #DocumentaTon#officielle#SGI#

htp://www.sgi.com/tech/stl/##

•  ReprésentaTon#UML#de#la#STL#

htp://frog.isima.fr/bruno/retrieve.htm?archive=stl_containers##

•  Sur#le#C++#en#général##htp://www.cplusplus.com/reference/##

#

36

Quelques#liens#…#