Présentation Eveline Duhamel - CESE- Conférence "Femmes et Précarité" du 3 avril 2014
Bibliothèque#standard#C++#duhamel/C++/stl.pdf · A.#C.#Duhamel# B.#Garcia## D.#Hill# L.#Yon#...
Transcript of Bibliothèque#standard#C++#duhamel/C++/stl.pdf · A.#C.#Duhamel# B.#Garcia## D.#Hill# L.#Yon#...
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#
• 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
#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(); };
• 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#
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#
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
• 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; }
• 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
• 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#…#