Set<Pointeur*> mal triée

SplotchLaFlak Messages postés 2 Date d'inscription lundi 4 avril 2005 Statut Membre Dernière intervention 15 juin 2009 - 15 déc. 2008 à 16:38
SplotchLaFlak Messages postés 2 Date d'inscription lundi 4 avril 2005 Statut Membre Dernière intervention 15 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 ?

Merci d'avance.

3 réponses

nickydaquick Messages postés 416 Date d'inscription vendredi 31 janvier 2003 Statut Membre Dernière intervention 19 décembre 2013 3
15 déc. 2008 à 19:48
Salut,

typedef struct Comp
{
       public:
               bool operator() (const Pointeur*p1, const Pointeur* p2)const
               {
                     bool result = true;
                     //procede a tes comparaisons
                     return result;
               }
}Comp, *PComp;

ensuite lorsque tu construis ton Set:

set Conteneur;

bonne continuation.
http://liveplayaz.com

je suis heureux de faire partie d'une grande famille ...!
0
gaspos Messages postés 17 Date d'inscription jeudi 9 décembre 2004 Statut Membre Dernière intervention 20 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 ;
    }




et voilà !

Hadrien
0
SplotchLaFlak Messages postés 2 Date d'inscription lundi 4 avril 2005 Statut Membre Dernière intervention 15 juin 2009
16 déc. 2008 à 23:33
Je teste ca et je vous tiens au courant
0
Rejoignez-nous