vector et sort

Le
LaFleche
Bonjour,

Je cherche à trier un vector avec la fonction sort de la stl.
J'ai donc redéfini l'opérateur < dans ma classe A de la manière suivante
A.h
bool operator<(const A& a)const

Le problème c'est que le sort fonctionne si mon vector contient des
instances de A (vector<A>) mais pas avec des pointeurs (vector<A*>).

Existe-il un moyen (propre si possible) de contourner le problème?

Merci
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Patrick Mézard
Le #169491
LaFleche wrote:
Bonjour,

Je cherche à trier un vector avec la fonction sort de la stl.
J'ai donc redéfini l'opérateur < dans ma classe A de la manière suivante
------A.h------
bool operator<(const A& a)const

Le problème c'est que le sort fonctionne si mon vector contient des
instances de A (vector<A>) mais pas avec des pointeurs (vector<A*>).

Existe-il un moyen (propre si possible) de contourner le problème?

Merci



Oui, créer un prédicat de comparaison du genre :

struct CompareA
{
inline bool operator()(const A* a1, const A* a2) const
{
//Gèrer le cas s'ils peuvent être NULLs
assert(a1!=0 && a2!=0);
return (*a1)<(*a2);
}
};


et appeler le sort de la manière suivante :

typedef std::vector<A*> AArray;
AArray array;

[...] //on remplit array

std::sort(array.begin(), array.end(), CompareA());

L'intérêt principal de cette méthode (qui marche aussi dans le cas où le
conteneur contient des instances et non des pointeurs) est qu'elle
permet de définir différents critères de tris, au lieu d'un seul basé
sur l'operateur < du type en question.

Patrick Mézard

LaFleche
Le #169490
Patrick Mézard wrote:
LaFleche wrote:

Bonjour,

Je cherche à trier un vector avec la fonction sort de la stl.
J'ai donc redéfini l'opérateur < dans ma classe A de la manière suivante
------A.h------
bool operator<(const A& a)const

Le problème c'est que le sort fonctionne si mon vector contient des
instances de A (vector<A>) mais pas avec des pointeurs (vector<A*>).

Existe-il un moyen (propre si possible) de contourner le problème?

Merci



Oui, créer un prédicat de comparaison du genre :

struct CompareA
{
inline bool operator()(const A* a1, const A* a2) const
{
//Gèrer le cas s'ils peuvent être NULLs
assert(a1!=0 && a2!=0);
return (*a1)<(*a2);
}
};


et appeler le sort de la manière suivante :

typedef std::vector<A*> AArray;
AArray array;

[...] //on remplit array

std::sort(array.begin(), array.end(), CompareA());

L'intérêt principal de cette méthode (qui marche aussi dans le cas où le
conteneur contient des instances et non des pointeurs) est qu'elle
permet de définir différents critères de tris, au lieu d'un seul basé
sur l'operateur < du type en question.

Patrick Mézard


Parfait et je viens de voir que ca marche aussi avec un set<A*,CompareA>,

Merci beaucoup pour ta réponse.


Publicité
Poster une réponse
Anonyme