Trier une std::map

Résolu
simtiers Messages postés 207 Date d'inscription jeudi 3 avril 2003 Statut Membre Dernière intervention 2 novembre 2006 - 3 sept. 2005 à 20:26
simtiers Messages postés 207 Date d'inscription jeudi 3 avril 2003 Statut Membre Dernière intervention 2 novembre 2006 - 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
A voir également:

19 réponses

vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
3 sept. 2005 à 20:56
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>
2
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
3 sept. 2005 à 20:43
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
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
3 sept. 2005 à 20:44
Au fait, ceci sera plus joli ;)

bool CPlayer::operator<( CPlayer* player )
{
return posY < player->getPosY();
}
0
simtiers Messages postés 207 Date d'inscription jeudi 3 avril 2003 Statut Membre Dernière intervention 2 novembre 2006
3 sept. 2005 à 20:45
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
3 sept. 2005 à 20:48
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
0
simtiers Messages postés 207 Date d'inscription jeudi 3 avril 2003 Statut Membre Dernière intervention 2 novembre 2006
3 sept. 2005 à 20:49
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();

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

Merci de m'aider vecchio
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
3 sept. 2005 à 21:01
Non on a pas le choix ;)
Attention, il faut CPlayer, pas CPlayer*!!
0
simtiers Messages postés 207 Date d'inscription jeudi 3 avril 2003 Statut Membre Dernière intervention 2 novembre 2006
3 sept. 2005 à 21:11
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 ?
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
3 sept. 2005 à 21:23
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
0
simtiers Messages postés 207 Date d'inscription jeudi 3 avril 2003 Statut Membre Dernière intervention 2 novembre 2006
3 sept. 2005 à 21:26
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
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
3 sept. 2005 à 21:30
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
0
simtiers Messages postés 207 Date d'inscription jeudi 3 avril 2003 Statut Membre Dernière intervention 2 novembre 2006
3 sept. 2005 à 21:33
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>...
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
3 sept. 2005 à 21:37
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
0
simtiers Messages postés 207 Date d'inscription jeudi 3 avril 2003 Statut Membre Dernière intervention 2 novembre 2006
3 sept. 2005 à 21:40
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)
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
3 sept. 2005 à 21:46
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
0
simtiers Messages postés 207 Date d'inscription jeudi 3 avril 2003 Statut Membre Dernière intervention 2 novembre 2006
3 sept. 2005 à 21:49
ok, je prendrais donc un vector ou un list, à trier avec std::sort(..) je suppose
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
3 sept. 2005 à 21:51
Plutot list::sort
0
simtiers Messages postés 207 Date d'inscription jeudi 3 avril 2003 Statut Membre Dernière intervention 2 novembre 2006
4 sept. 2005 à 12:03
ç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 !
0
Rejoignez-nous