Trier une std::map [Résolu]

simtiers 207 Messages postés jeudi 3 avril 2003Date d'inscription 2 novembre 2006 Dernière intervention - 3 sept. 2005 à 20:26 - Dernière réponse : simtiers 207 Messages postés jeudi 3 avril 2003Date d'inscription 2 novembre 2006 Dernière intervention
- 4 sept. 2005 à 12:03
Salut !



voilà, j'ai une classe CPlayer avec une surcharge de l'operateur < (posY est une variable int private) :

bool CPlayer::operator<( CPlayer* player )

{

if( posY < player->getPosY() )

return true;



return false;

}



J'utiliser une std::map pour ranger tous mes pointeurs vers un objet CPlayer.

Il faudrait que la map classe les joueurs en fonction de leur position
Y (c'est pourquoi l'operateur < ne vérifie que cette coordonée)



Le problème est que je ne sais pas comment faire : je n'arrive pas à utiliser la méthode sort de std::algorithm

Si qq'1 avait une idée, ce serait sympa de me la donner



Merci
Afficher la suite 

19 réponses

Répondre au sujet
vecchio56 6539 Messages postés lundi 16 décembre 2002Date d'inscription 22 août 2010 Dernière intervention - 3 sept. 2005 à 20:56
+2
Utile
C'est une map<std::string, CPlayer*>

Dans ce cas, la map sera triée selon la string, donc tu n'y est pas
Pour que ce soit trié selon le CPlayer, tu dois avoir une
map<CPlayer, std::string>
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de vecchio56
vecchio56 6539 Messages postés lundi 16 décembre 2002Date d'inscription 22 août 2010 Dernière intervention - 3 sept. 2005 à 20:43
0
Utile
Une map est toujours triée. C'est à l'insertion que l'opérateur < est utilisé, pour insérer l'élément au bon endroit
Commenter la réponse de vecchio56
vecchio56 6539 Messages postés lundi 16 décembre 2002Date d'inscription 22 août 2010 Dernière intervention - 3 sept. 2005 à 20:44
0
Utile
Au fait, ceci sera plus joli ;)

bool CPlayer::operator<( CPlayer* player )
{
return posY < player->getPosY();
}
Commenter la réponse de vecchio56
simtiers 207 Messages postés jeudi 3 avril 2003Date d'inscription 2 novembre 2006 Dernière intervention - 3 sept. 2005 à 20:45
0
Utile
Y'a t il un moyen de trier la map à un moment voulu ?

En fait, elle est trier dès qu'il y a un mouvement => c'est pour
l'ordre d'affichage pour eviter les erreurs de chevauchement.
Commenter la réponse de simtiers
vecchio56 6539 Messages postés lundi 16 décembre 2002Date d'inscription 22 août 2010 Dernière intervention - 3 sept. 2005 à 20:48
0
Utile
Tu es sur que ca marche ton truc? Comme tu utilises des pointeurs, je suis pas sur que operator< sera bien utilisé. Je teste ca
Commenter la réponse de vecchio56
simtiers 207 Messages postés jeudi 3 avril 2003Date d'inscription 2 novembre 2006 Dernière intervention - 3 sept. 2005 à 20:49
0
Utile
en fait, pour récupérer le pointeur à partir de l'iterateur, je fais ça :



for( std::map<std::string,CPlayer*>::iterator it = pointersMap.begin();

it != pointersMap.end(); it++ )

{

CPlayer* tempPointer = (*it).second;

if( tempPointer != NULL )

tempPointer->render();

}
Commenter la réponse de simtiers
simtiers 207 Messages postés jeudi 3 avril 2003Date d'inscription 2 novembre 2006 Dernière intervention - 3 sept. 2005 à 20:57
0
Utile
ça va être chaud à changer, mais bon, si on n'a pas le choix.....

Merci de m'aider vecchio
Commenter la réponse de simtiers
vecchio56 6539 Messages postés lundi 16 décembre 2002Date d'inscription 22 août 2010 Dernière intervention - 3 sept. 2005 à 21:01
0
Utile
Non on a pas le choix ;)
Attention, il faut CPlayer, pas CPlayer*!!
Commenter la réponse de vecchio56
simtiers 207 Messages postés jeudi 3 avril 2003Date d'inscription 2 novembre 2006 Dernière intervention - 3 sept. 2005 à 21:11
0
Utile
J'ai juste un pb : le string est l'identifiant du joueur

J'accède au pointeur CPlayer* via cet identifiant mais l'operateur [] de map ne marche qu'avec la clé (ce qui est logique)

Donc si je fais map<CPlayer, string>, je perd l'interet d'utiliser map...



Sinon, j'utilise un vector<CPlayer*>, et je le trie à partir
d'une classe différente, surchargeant l'operateur <(Cplayer*,
Cplayer*)



Qu'est-ce que tu en penses ?
Commenter la réponse de simtiers
vecchio56 6539 Messages postés lundi 16 décembre 2002Date d'inscription 22 août 2010 Dernière intervention - 3 sept. 2005 à 21:23
0
Utile
Dans ca cas il y a quelque chose que je ne comprends pas: pourquoi tu veux trier les CPlayer?
La map est triée dans le seul but d'accélérer la recherche
Commenter la réponse de vecchio56
simtiers 207 Messages postés jeudi 3 avril 2003Date d'inscription 2 novembre 2006 Dernière intervention - 3 sept. 2005 à 21:26
0
Utile
Je veux trier les CPlayer pour eviter que celui du dessus soit dessiné
après celui du dessous => ça évite le chevauchement (les jambes de
celui du dessus soit dessinées sur la tete de celui du dessous)



=> je veux trier CPlayer en fonction de la valeur de posY de CPlayer
Commenter la réponse de simtiers
vecchio56 6539 Messages postés lundi 16 décembre 2002Date d'inscription 22 août 2010 Dernière intervention - 3 sept. 2005 à 21:30
0
Utile
OK. Dans ce cas, tu peux utiliser une map<string, CPlayer*> pour rechercher en fonction du nom, et un set<CPlayer> pour avoir les CPlayer triés.
Par contre, est-ce que tu fais beaucoup d'insertions/suppressions de joueurs?
Tu peux mettre aussi tes joueurs dans une list ou un vector, le trier une fois et puis c'est bon
Commenter la réponse de vecchio56
simtiers 207 Messages postés jeudi 3 avril 2003Date d'inscription 2 novembre 2006 Dernière intervention - 3 sept. 2005 à 21:33
0
Utile
Les joueurs sont en mouvement, donc le tri a lieu souvent

Par contre, je vois pas trop comment tu veux que j'utilise le set<CPlayer>...
Commenter la réponse de simtiers
vecchio56 6539 Messages postés lundi 16 décembre 2002Date d'inscription 22 août 2010 Dernière intervention - 3 sept. 2005 à 21:37
0
Utile
Si le tri à lieu souvent, tu ne dois pas utiliser une map, (si un set).
Tu peux utiliser un vector ou une list, je pense que ca revient au même
Commenter la réponse de vecchio56
simtiers 207 Messages postés jeudi 3 avril 2003Date d'inscription 2 novembre 2006 Dernière intervention - 3 sept. 2005 à 21:40
0
Utile
Bon, j'ai compris.



Il va donc me falloir utiliser un set<CPlayer> pour stocker mes
joueurs et ajouter des algos de recherches pour avoir accés au joueurs
via l'identifiant (ça va, c'est pas trop trop courant)
Commenter la réponse de simtiers
vecchio56 6539 Messages postés lundi 16 décembre 2002Date d'inscription 22 août 2010 Dernière intervention - 3 sept. 2005 à 21:46
0
Utile
oula, je voulais écrire tu ne dois pas utiliser une map NI un set
Un set tu pourra pas le trier quand tu veux, ca correspond pas à ce que tu veux faire.
Tu dois utiliser une structure de données plus simple, tableau ou liste
Commenter la réponse de vecchio56
simtiers 207 Messages postés jeudi 3 avril 2003Date d'inscription 2 novembre 2006 Dernière intervention - 3 sept. 2005 à 21:49
0
Utile
ok, je prendrais donc un vector ou un list, à trier avec std::sort(..) je suppose
Commenter la réponse de simtiers
vecchio56 6539 Messages postés lundi 16 décembre 2002Date d'inscription 22 août 2010 Dernière intervention - 3 sept. 2005 à 21:51
0
Utile
Plutot list::sort
Commenter la réponse de vecchio56
simtiers 207 Messages postés jeudi 3 avril 2003Date d'inscription 2 novembre 2006 Dernière intervention - 4 sept. 2005 à 12:03
0
Utile
ça y est ça marche !



J'utilise désormais une std::list<CPlayer> avec un sort à chaque déplacement et ça marche nickel !



Merci de ton aide vecchio !
Commenter la réponse de simtiers

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.