SplotchLaFlak
Messages postés2Date d'inscriptionlundi 4 avril 2005StatutMembreDernière intervention15 juin 2009
-
15 déc. 2008 à 16:38
SplotchLaFlak
Messages postés2Date d'inscriptionlundi 4 avril 2005StatutMembreDernière intervention15 juin 2009
-
16 déc. 2008 à 23:33
Bonjour, j'ai un petit problème d'implémentation de mon conteneur std::set.
J'en ai besoin pour triée des valeurs que je lui passe sous forme de pointeurs.
Je le déclare ainsi set _liste;
Malheuresement ce set est ordonnée en fonction de la valeur de l'adresse et non de la valeur du comparateur que j'ai définit pour le pointeur.
bool operator__ (const Pointeur*, const Pointeur*);
Quel possibilité ai-je pour que ce tri se fasse en fonction des valeurs du pointeur et non de son adresse ?
gaspos
Messages postés17Date d'inscriptionjeudi 9 décembre 2004StatutMembreDernière intervention20 février 2009 15 déc. 2008 à 19:56
Bonjour,il faut préciser à la classe set comment comparer les éléments.<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>
Par défaut, il utilise l’opérateur « < ».
Si tu veux qu’il en soit autrement, il faut lui donner de quoi savoir qu’un élément est inferieur à un autre.
Tu as 2 façons de faire :
une courte (en nb de lignes de code) : une fonction qui prend en paramètre 2 éléments et renvoie un bool qui est vrai quand le premier paramètre est strictement inferieur au second. C’est toi qui choisit le sens de « inferieur ».
une plus longue : un objet qui implémente l’operateur () avec la même signature que la fonction décrite au dessus. L’avantage de cette seconde façon est qu’elle te donne accès à un contexte : dans notre exemple, le membre
« croissant ».
Exemple :
#include
#include <set>
using namespace std;
typedef int * Pointer ;
// comparaison utilisant une fonction => impossible d'avoir un contexte
bool f_compare ( Pointer p1 , Pointer p2 )
{
return( *p1 < *p2 ) ;
}
// comparaison utilisant une classe (dans ce cas, sans contexte)
class c_compare
{
public:
// ici, pas de constructeur défini => constructeur par defaut qui ne fait rien...
bool operator() ( Pointer p1 , Pointer p2 ) const
{
return( *p1 < *p2 ) ;
}
} ;
// comparaison utilisant une classe (cette fois avec un contexte)
class c_compare_avec_context
{
public:
// constructeur explicite
c_compare_avec_context ( bool c )
{
croissant = c ;
}
bool operator() ( Pointer p1 , Pointer p2 ) const
{
return( croissant ? *p1 < *p2 : *p1 > *p2 ) ;
}
private:
bool croissant ;
} ;
void main ()
{
set set1 ; // appel du constructeur par defaut
set set2 ( f_compare ) ; // fonction -> pas de constructeur
set set3 ( false ) ; // appel du constructeur explicite avec le param "false"
int tab [] = { 3,2,1,4,5 } ; // valeurs dans le desordre...
for ( int i = 0 ; i < 5 ; ++i )
{
set1.insert( &tab[i] ) ;
set2.insert( &tab[i] ) ;
set3.insert( &tab[i] ) ;
}
cout << "set1 :" ;
for ( set::iterator i = set1.begin() ; i != set1.end() ; ++i )
cout << " " << **i ;
cout << endl ;
cout << "set2 :" ;
for ( set::iterator i = set2.begin() ; i != set2.end() ; ++i )
cout << " " << **i ;
cout << endl ;
cout << "set3 :" ; // sera trié en sens inverse !
for ( set::iterator i = set3.begin() ; i != set3.end() ; ++i )
cout << " " << **i ;
cout << endl ;
}