Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

STANDARD TEMPLATE LIBRARY(STL)


Information sur le tutorial

Catégorie :Tutoriaux Date de création : 20/08/2005 21:48:03 Vu : 25 656 fois

Note :
2,6 / 10 - par 5 personnes
2,60 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (7)
Ajouter un commentaire et/ou une note

Description

A l'image du langage C, le langage C++ exploite une librarie provenant essentiellement d'Unix ,système d'exploitation fondé sur sur le C.
Les concepteurs de C++ ont ajouté une autre bibliothèque pour utiliser les nouvelles possibilités d'abstraction du langage.
La bibliothèque STL contient de nombreux modèles de fonctions et de classes qui ne peuvent etre implementes de maniere optimale dans le langage lui-meme.
Elle fournit des utlitaires pour batir d'autres bibliotheques.
Vous devriez en apprednre plus dans ce tutoriel.
Wina , La Vista...

Tutorial

A l'image du langage C, le langage C++ exploite une librarie provenant essentiellement d'Unix ,système d'exploitation fondé sur sur le C.
Les concepteurs de C++ ont ajouté une autre bibliothèque pour utiliser les nouvelles possibilités d'abstraction du langage.
La bibliothèque STL contient de nombreux modèles de fonctions et de classes qui ne peuvent etre implementes de maniere optimale dans le langage lui-meme.
Elle fournit des utlitaires pour batir d'autres bibliotheques.
Vous devriez en apprednre plus dans ce tutoriel.
Wina , La Vista...

1 - Organisation générale

Les fonctions de la bibliotheque standard sont definies dans l'espace de nom std(ou s).
Elles sont presentees sous la forme d'un ensemble d'en-tetes , a l'image de la bibliotheque du langage C.

Theme                                    Principales en-tetes
Conteneurs                             vector,listdeque,queu,stack,map,set,bitset
Utilitaires generaux                  utility,functional,memory,ctime
Operateurs d'iterations            iterator
Algorithmes                            algorithm,cstdlib
Diagnostics                            exception,stdexcept,cassert,cerrno      
Chaines                                 string,cctype,cwtype,cstring,cwchar,cstdlib
Entrees/Sorties                      iosfwd,iostream,ios,streambuf,istream,ostream,
                                             iomanip,sstream,cstdlib,fstream,cstdio,cwchar
                             
Localisation                          locale,clocale
Support du langage               limits,climits,cfloat,new,typeinfo,exception, 
                                            cstddef,stdarg,csetjmp,cstdlib,ctime,csignal  
Caracteres numeriques         complex,valarray,numeric,cmath,cstdlib

Vous pouvez avoir la doc sur STL via google.

Bonne pioche...

2 - Conteneurs

Les conteneurs sont des objets prevus pour rassembler d'autres objets.
L'horlogeneite des objets contenus et leur mode d'acces(indexe,noms,indtermine)determinent differents types de contenurs.
La STL connnait les vecteurs(tableaux a une dimension), les listes doublement chainees,les files d'attentes a simmple et double acces , les piles , les tableuax associatifs , les ensebmles et les tableuax de booleens.

Exemple de STL::conteneurs
#include <windows.h>
#include <iostream.h>
#include <vector.h>

LONG lFin = 0

using namespace std; // utilise la bibliotheque STL standard du C++ pure

void main()
{
// Un vecteur compose de 3 chaines de carateres
vectorvector<char*>vect(3);
// Charger le vecteur
vect.at(0)="debut\n";
vect.at(0)="Afficher\n";
vect.at(0)="Fin\n";
// aficher le vecteur
for(int i=0; i<vect.size();i++)
cout<<vect.at(i)<<endl;

return lFin;
}

2 - Une chaine est une suite ordonnee de caracteres , et la bibliotheque STL fournit une classe pour raseembler toutes les operations habituelles concernant les chaines.
L'implementation des chaines prevue par le langage C donne une part trop belle aux pointeurs.
Au dela des fonctions de base(longueur,comparaison), d'autres operations plus complexes(recherche,remplacement,mise en memoire indexee (buffer) tampon)sont mieux supportes par la STL.
Par ailleurs, l'impemenation sous la forme d'une classe aux operateurs surcharges rend les notations beaucoup plus lisibles et beaucoup plus claires

Exemple :

#include <windows.h>
#include <iostream.h>
#include <string>

using namespace std;

LONG lFin=0x0000;

void main()
{
sring s1="Windows Vista" s2="Linux Debian";

// comparer les deux chaines
if(s1 !=s2)
cout <<"l'operateur != est plus simple que strcmp !"<<endl;

// concatener
string s3=s1+""+s2;
cout<<s3.c_str()<<endl;

// rechercher
cout<<"trouver " <<s2.c_str()<<" dans "<<s1.c_str()<<" : ";
string::size_type t=s1.find(s2);
cout<<t<<endl;

// remplacer du texte
s1.replace(0,3,"lpstrGeek");
cout<<s1.c_str()<<endl;

// itrerer
for(int i=0; i<s1.length();i++)
cout<<s1[i]<<" ";
return lFin;
}

Interessons nous maintenant au mecanisme d'entrees et de sorties, utilises
notmamment pour des operations sur fichier dans une interface utilisateur.


Entrees/Sorties

Bien qu'il soit tout a fait envisageable d'utiliser les fonctions C de <stdio.h>
Pour:
Ouvrir :  fopen
Lire   :  fread
Ecrire :  fwrite
Fermer :  fclose
des fichiers , la STL met a la disposition ndu developpeur un tout nouveau dispositif objet.
Il s'agit des flux(streams) et nous connaissons deja cin et cout.
Ces flux sont bases sur la classer ios, a partir de laquelle sont derivees des classes generales comme istream et ostream , des classes d'acces aux fichers fstream et des classes de flux memoire strstreambase.
Pour les acces de bas niveau(low level access LLA), il y a la classe streambuf qui se derive en filebuf,stdiobuf,strstreambuf,conbuf.

L'exemple  qui suit illustre les flux fonctionnant avec ios e l'emploi de formateurs
pour manipuler des fichiers.


Exemple :

#include <windows.h>
#include <iostream.h>
#include <fstream.h>

LONG lFin=E_FAIL;

void main()
{
// generer un flux en sortie associe a un fichier

ofstream sortie("_test.txt",ios::sbinary);// _test.txt est un nom de fichier comme
// tout autre.on aurait pu mettre test.txt ou t_text.txt , ca n'y changerait que dalle
// soyez creatifs :) newbies bien surs

// ecrire dans le fichier

sortie<<"il est tres confortable d'ecrire dans " <<1<<" fichier ";
sortie<<endl;
// comme vous le notez il est possible d'ecrire sur autant de lignes qu'on le souhaite avec le // C++ et la STL
sortie<<" certains formateurs sont disponibles : "<< hex << 20<<endl;

// fermer le flux precedement ouvert
sortie.close();

// generer un flux associe a un fichier
ifstream entree("_test.txt");
entree.unsetf(ios::skipws); // il ne faut surtotu pas ingorer les espaces

// affichage
unsigned char c;
while(entree>>c) // lire le caractere
cout<<c; // l'affichage final a l'ecran

// fermer le flux d'entree

entree.close();
return lFin; // meme message que pour _text un peu plus haut :)
}

Pour les operations d'netree/sortie , l'approche des flux hisse C++ au niveau des langages moderne qui separent donnees et emplacement.
Partant de ce principe ineductable , l'adaptation d'un programme utilisant des fichers a une version reseau deveint alors trop simple.

Fin du tuto ...


A bientot,
donc,t bonne prog,
Wina , La Vista , ciao ! et a++ :=)

                                                                                           

signaler à un administrateur
Commentaire de cosmobob le 22/08/2005 17:07:46

salut,
#include <iostream.h>
#include <fstream.h>
sont à bannir, il faut inclure a la place <iostream> et <fstream> (par exemple, les fonctions de iostream.h ne sont pas toutes les memes que celle du standard iostream sur vc6)
De meme, pour afficher un string, pas besoin de faire:
cout<<s3.c_str()<<endl;
on peut faire:
cout << s3 << endl;

sinon c'est vraiment un tutorial sur la STL ultra minimaliste vu que seul 5% de la STl est présenté !!!!!

signaler à un administrateur
Commentaire de cosmobob le 22/08/2005 17:09:11

un bon tuto sur la STL:
http://casteyde.christian.free.fr/online/cours_cpp/p4895.html

signaler à un administrateur
Commentaire de NitRic le 11/12/2005 06:17:41

«
#include <iostream.h>
#include <vector.h>
»
- pourquoi ne pas utiliser les <xyz.h>? parce que c'est la vieille version de la STL
- la nouvelle(celle revisée) n'a aucun .h: <iostream>, <string>, <vector>, <list>, ...
- les autres(avec les .h) ont probablement été gardé pour des raisons de compatibilité
- tout simplement ...

« using namespace std; // utilise la bibliotheque STL standard du C++ pure »
- ce n'est pas la 'bibliothèque' mais l'espace nommé, 'std'
- il y a une différence entre une 'bibliothèque' et un 'espace de nom'(ou espace nommé)

« vectorvector<char*>vect(3); »
- bon okay, une faute de frappe peut-être mais _un_ vector suffit: vector<char *> vect(3);

«
vect.at(0)="debut\n";
vect.at(0)="Afficher\n";
vect.at(0)="Fin\n";
»
- t'assigne les trois à l'indice zéro(0) ???
- pourquoi ne pas utiliser ' .push_back() ' ?

«
for(int i=0; i<vect.size();i++)
cout<<vect.at(i)<<endl;
»
- pourquoi ne pas utiliser un simple itérateur:
- for (vector<char *>::const_iterator it = vect.begin(); it != vect.end(); it++)
- {
-   cout << (*it) << endl;
- }
- pour ton information, l'opérateur [] est overloadé(surchargé) pour vector
- cout << vect[nIndice] << endl;
- mais c'est vrai que ' .at() ' est plus 'safe'(mais plus lent) car il vérifie pour éviter
- les 'out of range', si c'est le cas, il te balance une exception ...

« return lFin; »
- un 'return' avec un ' void main() ' ???

« sring s1="Windows Vista" s2="Linux Debian"; »
- je crois qu'il te manque une virgule ici ...

« string s3=s1+""+s2; »
- pour que ce soit un peu plus compréhensible/clair/... comme exemple t'aurais pu
- ajouter(concatener) quelque chose plutôt que _rien_ ...

« cout<<s3.c_str()<<endl; »
- a noter que ce n'est pas necessaire le '.c_str()' car la classe 'string'
- overload(surcharge) déjà les opérateurs << et >> pour cout/cin

«
// itrerer
for(int i=0; i<s1.length();i++)
»
- non non, 'i' n'est pas un itérateur, va reviser tes devoirs ...

- et main() retourne un 'int' pas un 'long'
- va aussi reviser ca ...

- ...

- ...

- ...



~(.:: NitRic ::.)~

signaler à un administrateur
Commentaire de exar le 14/05/2006 13:59:31

Hello !
Autre petite remarque: il est déconseillé d'utiliser la clause "using namespace", sinon l'espace de nommage n'a plus aucune utilité...
Préférer std::
autrement, c'est vrai que ce tutoriel est assez succint...  La STL permet énormément plus de choses que ce qui est présenté dans cet article.
Je pense que je vais m'atteler à créer un tutoriel sur la STL que je posterai ici.

signaler à un administrateur
Commentaire de sofi_dz le 13/06/2006 17:11:01

bonjour , j'ai une question svp : j'utilise une map <int,float> mais pour l'ecriture et la lecture ca prend bc de temps quand j'utilise une boucle avec fwrite et fread, je voulais savoir si il ya un moyen plus rapide ....???

for( map<int, float >::iterator iter = Signature.begin(); iter != Signature.end(); iter++ )
  {
    bin      =  iter->first ;
            count    =  iter->second;
    fwrite( &bin  , sizeof(bin) , 1, file );
    fwrite( &count, sizeof(count) , 1, file );
          }

signaler à un administrateur
Commentaire de manianiss le 28/01/2007 20:54:07

Bon essai pour aborder le STL... Bien qu'il nécessite des contributions...

signaler à un administrateur
Commentaire de spidermario le 26/05/2007 13:11:44

J'ajouterais en plus des commentaires déjà présents que dans les headers <xyz.h>, il n'y a pas le namespace std et le "using namespace std" devient inutile et les std:: ne marchent plus.

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,125 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.