IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
logo

FAQ C++Consultez toutes les FAQ

Nombre d'auteurs : 34, nombre de questions : 368, derni�re mise � jour : 14 novembre 2021  Ajouter une question

 

Cette FAQ a �t� r�alis�e � partir des questions fr�quemment pos�es sur les forums de http://www.developpez.com et de l'exp�rience personnelle des auteurs.

Je tiens � souligner que cette FAQ ne garantit en aucun cas que les informations qu'elle propose sont correctes ; les auteurs font le maximum, mais l'erreur est humaine. Cette FAQ ne pr�tend pas non plus �tre compl�te. Si vous trouvez une erreur ou si vous souhaitez devenir r�dacteur, lisez ceci.

Sur ce, nous vous souhaitons une bonne lecture.

SommaireLa STL (15)
pr�c�dent sommaire suivant
 

Le C++ poss�de une biblioth�que standard (on parle aussi de SL pour Standard Library) qui est compos�e, entre autre, d'une biblioth�que de flux, de la biblioth�que standard du C, de la gestion des exceptions�, et de la STL (Standard Template Library : biblioth�que de mod�les standard). En fait, STL est une appellation historique commun�ment accept�e et comprise. Dans la norme on ne parle que de SL.
Comme son nom l'indique cette biblioth�que utilise fortement les templates C++ et le concept de g�n�ricit�. Elle d�finit ainsi de nombreux mod�les de classes et de fonctions g�n�riques parmi lesquelles les conteneurs (tableau, liste, pile, ensemble�) et les algorithmes (copie, tri, recherche�) les plus courants. Une particularit� importante est son approche orient�e it�rateurs, ce qui permet par exemple d'utiliser ses algorithmes sur d'autres conteneurs que ceux qu'elle fournit.
L'un des avantages de la STL par rapport aux autres biblioth�ques remplissant (plus ou moins) le m�me r�le est qu'elle est standard, et donc th�oriquement portable (cependant les limites de certains compilateurs compliquent la chose). Un autre avantage important est son polymorphisme param�trique qui assure un typage fort sans exigence syntaxique � l'utilisation, c'est-�-dire par exemple que l'on peut tr�s simplement cr�er un tableau de ce que l'on veut sans devoir downcaster depuis un horrible type commun tel que void *.
Utiliser la STL permet donc d'augmenter de mani�re significative sa productivit� en C++ en �crivant du code fiable, performant et portable.

Mis � jour le 19 octobre 2004 Aurelien.Regat-Barrel LFE Luc Hermitte

Toute classe surchargeant l'op�rateur d'appel de fonction operator() est qualifi�e de classe foncteur (functor class). Les objets instanci�s d'une telle classe sont appel�s objets fonctionnels (function objects) ou foncteurs (functors). La STL utilise beaucoup ce concept pour personnaliser le comportement de ses classes/fonctions.
Notez qu'on peut tout � fait utiliser des pointeurs sur fonction au lieu de foncteurs (il suffit de pouvoir appliquer l'op�rateur�() � l'objet pass� en param�tre), mais on pr�f�rera les foncteurs car ils offrent plus de performances et de flexibilit�. En effet operator() peut �tre enti�rement inlin�, et on peut passer des param�tres au foncteur via son constructeur pour plus de souplesse.
Voici un exemple typique de foncteurs tir� de la question [Exemple] Comment trier une s�quence selon un crit�re personnalis� ?

Code c++ : S�lectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
struct A  
{  
    int Number;  
    std::string String;  
};  
  
// D�finition du foncteur servant � trier nos objets selon le nombre  
struct SortByNumber  
{  
    bool operator ()( const A & a1, const A & a2 ) const  
    {  
        return a1.Number < a2.Number;  
    }  
};  
  
// D�finition du foncteur servant � trier nos objets selon la cha�ne  
struct SortByString  
{  
    bool operator ()( const A & a1, const A & a2 ) const  
    {  
        return a1.String < a2.String;  
    }  
};
Les foncteurs sont en particulier utilis�s dans le cadre des pr�dicats (lire Qu'est-ce qu'un pr�dicat ?).

Mis � jour le 18 avril 2005 Laurent Gomila

Les pr�dicats (predicate) sont un type particulier de foncteurs qui renvoient un bool�en ou quelque chose de convertible en bool�en ce qui les rend utilisables dans des expressions logiques. Il existe un certain nombre de pr�dicats pr�d�finis dans la STL, en particulier en ce qui concerne les op�rateurs logiques et arithm�tiques �l�mentaires :

Code c++ : S�lectionner tout
1
2
3
4
5
int a = 2;  
if ( std::greater<int>()( a, 1 ) )  
{  
    // ce test est vrai car a > 1  
}
L'int�r�t des pr�dicats est qu'ils peuvent �tre utilis�s comme crit�re d'�valuation dans bon nombre d'algorithmes et conteneurs de la STL. Par exemple le conteneur std::set utilise par d�faut le pr�dicat std::less afin d'organiser ses �l�ments de mani�re croissante. Il est facile de changer ce crit�re pour cr�er un std::set organis� de mani�re d�croissante en sp�cifiant std::greater.

Code c++ : S�lectionner tout
std::set< std::greater<int> > entiersTriesParOrdreDecroissant;
Mais les pr�dicats r�v�lent toute leur puissance lorsqu'ils sont utilis�s conjointement avec les foncteurs r�ducteurs std::bind1st et std::bind2nd. Pour plus d'informations lire � quoi servent les fonctions bind1st et bind2nd ?.

Mis � jour le 18 avril 2005 Aurelien.Regat-Barrel

std::bind1st et std::bind2nd sont un type particulier de foncteurs appel�s foncteurs r�ducteurs. Ils permettent de facilement cr�er un pr�dicat unaire (c.a.d acceptant un seul param�tre) � partir d'un pr�dicat binaire (en acceptant deux param�tres). Ceci est fait en figeant la valeur d'un des deux param�tres du pr�dicat binaire (c.a.d. � le remplacer par une valeur fixe).
Soit l'exemple suivant o� le pr�dicat plus_grand_que_10 est cr�� afin de compter gr�ce � std::count_if le nombre de valeurs sup�rieures � 10 dans un conteneur :

Code c++ : S�lectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>  
#include <vector>  
#include <algorithm>  
  
// pr�dicat personnalis� permettant de tester si un  
// entier est strictement sup�rieur � 10  
struct plus_grand_que_10  
{  
    bool operator ()( int N ) const  
    {  
        return N > 10;  
    }  
};  
  
int main()  
{  
    std::vector<int> v;  
    v.push_back( 0 );  
    v.push_back( 5 );  
    v.push_back( 10 );  
    v.push_back( 15 );  
    v.push_back( 20 );  
  
    // compter le nombre de valeurs > 10  
    int n = std::count_if(  
        v.begin(),  
        v.end(),  
        plus_grand_que_10() ); // utilisation de notre pr�dicat  
  
    std::cout << n << '\n'; // affiche 2  
}
plus_grand_que_10 est un pr�dicat unaire obtenu en figeant le second argument de l'op�rateur de comparaison sup�rieur � la valeur 10. On aurait pu aussi obtenir le m�me r�sultat en figeant le premier param�tre de l'op�rateur inf�rieur cette fois-ci :

Code c++ : S�lectionner tout
1
2
3
4
5
6
7
struct plus_grand_que_10  
{  
    bool operator ()( int N ) const  
    {  
        return 10 < N;  
    }  
};
bind1st et bind2nd permettent de simplifier cette t�che fastidieuse de d�finition d'un pr�dicat binaire.
bind1st permet de figer le premier argument d'un pr�dicat binaire.
bind2nd permet de figer le second argument d'un pr�dicat binaire.
Ils s'utilisent de cette mani�re :

Code c++ : S�lectionner tout
<bind>( <foncteur>, <valeur du param�tre � figer> );
L'exemple pr�c�dent peut alors �tre simplifi� ainsi:

Code c++ : S�lectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>  
#include <vector>  
#include <algorithm>  
#include <functional>  
  
int main()  
{  
    std::vector<int> v;  
    v.push_back( 0 );  
    v.push_back( 5 );  
    v.push_back( 10 );  
    v.push_back( 15 );  
    v.push_back( 20 );  
  
    // compter le nombre de valeurs > 10  
  
    // m�thode 1 : utilisation de bind2nd pour  
    // la cr�ation d'un pr�dicat x > 10  
    int n = std::count_if(  
        v.begin(),  
        v.end(),  
        std::bind2nd( std::greater<int>(), 10 ) );  
  
    std::cout << n << '\n'; // affiche 2  
  
    // m�thode 2 : utilisation de bind1st pour  
    // la cr�ation d'un pr�dicat 10 < x  
    n = std::count_if(  
        v.begin(),  
        v.end(),  
        std::bind1st( std::less<int>(), 10 ) );       
  
    std::cout << n << '\n'; // affiche 2  
}

Mis � jour le 18 avril 2005 Aurelien.Regat-Barrel

Proposer une nouvelle r�ponse sur la FAQ

Ce n'est pas l'endroit pour poser des questions, allez plut�t sur le forum de la rubrique pour �a


R�ponse � la question

Liens sous la question
pr�c�dent sommaire suivant
 

Les sources pr�sent�es sur cette page sont libres de droits et vous pouvez les utiliser � votre convenance. Par contre, la page de pr�sentation constitue une �uvre intellectuelle prot�g�e par les droits d'auteur. Copyright � 2025 Developpez Developpez LLC. Tous droits r�serv�s Developpez LLC. Aucune reproduction, m�me partielle, ne peut �tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'� trois ans de prison et jusqu'� 300 000 � de dommages et int�r�ts.