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 STLAlgorithmes (3)
pr�c�dent sommaire suivant
 

Tout cela est expliqu� dans le tutoriel de r0d : Les algorithmes de la STL.

Mis � jour le 15 octobre 2009 r0d

La fonction std::sort de la biblioth�que standard n'est compatible qu'avec les it�rateurs � acc�s direct (ceux pour lesquels les op�rateurs + et - sont d�finis), c'est-�-dire les it�rateurs de std::vector, std::string, std::deque et les pointeurs bruts. En effet, l'acc�s direct est l'un des pr�requis de l'algorithme de tri.

Pour trier un conteneur de type std::list, il faut utiliser la fonction membre std::list::sort() :

Code c++ : S�lectionner tout
1
2
3
4
5
6
std::list<int> mylist; 
mylist.sort(); 
  
// Ou alors, avec un foncteur : 
std::list<int> mylist; 
mylist.sort(MonFoncteur());
Notez que cette version particuli�re sera plus lente que la version g�n�rique.

Pour les utilisateurs de Visual C++ 6, la STL de ce dernier ne d�finit pas la version prenant en param�tre un foncteur (� cause du manque de support des fonctions membres templates). Dans ce cas, une solution peut �tre de passer par un vecteur :

Code c++ : S�lectionner tout
1
2
3
4
5
6
7
8
9
// Copie de la liste dans un nouveau vecteur 
std::vector v(mylist.begin(), mylist.end()); 
  
// Tri du vecteur 
std::sort(v.begin(), v.end(), MonFoncteur()); 
  
// Recopie du vecteur dans la liste originale 
mylist.clear(); 
std::copy(v.begin(), v.end(), std::back_inserter(mylist));

Mis � jour le 15 octobre 2009 Laurent Gomila

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include <vector>  
#include <algorithm>  
#include <iostream>  
#include <string>  
#include <set>  
  
// D�finition de notre structure � trier  
struct A  
{  
   A(int i, std::string s) : Number(i), String(s) {}  
  
   int Number;  
   std::string String;  
};  
  
// Surcharge de l'op�rateur << pour afficher nos A  
std::ostream& operator <<(std::ostream& Stream, const A& a)  
{  
   return Stream << a.Number << " " << a.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;  
   }  
};  
  
int main()  
{  
   // Cr�ation d'un tableau de A  
   std::vector<A> v;  
   v.push_back(A(1, "salut"));  
   v.push_back(A(5, "hello"));  
   v.push_back(A(2, "buenos dias"));  
  
   // Tri selon leur num�ro  
   std::sort(v.begin(), v.end(), SortByNumber());  
   std::copy(v.begin(), v.end(), std::ostream_iterator<A>(std::cout, "\n"));  
   std::cout << std::endl;  
  
   // Tri selon leur cha�ne de caract�res  
   std::sort(v.begin(), v.end(), SortByString());  
   std::copy(v.begin(), v.end(), std::ostream_iterator<A>(std::cout, "\n"));  
   std::cout << std::endl;  
  
   // On peut �galement personnaliser le comportement des conteneurs tri�s  
   std::set<A, SortByString> s;  
   s.insert(A(1, "salut"));  
   s.insert(A(5, "hello"));  
   s.insert(A(2, "buenos dias"));  
  
   // Les �l�ments du conteneurs sont automatiquement tri�s selon leur cha�ne gr�ce � notre foncteur 
   std::copy(s.begin(), s.end(), std::ostream_iterator<A>(std::cout, "\n"));  
  
   return 0;  
}

Mis � jour le 19 octobre 2004 Laurent Gomila

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.