Trier une std::map [Résolu]

Signaler
Messages postés
207
Date d'inscription
jeudi 3 avril 2003
Statut
Membre
Dernière intervention
2 novembre 2006
-
simtiers
Messages postés
207
Date d'inscription
jeudi 3 avril 2003
Statut
Membre
Dernière intervention
2 novembre 2006
-
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

19 réponses

Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
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>
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
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
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Au fait, ceci sera plus joli ;)

bool CPlayer::operator<( CPlayer* player )
{
return posY < player->getPosY();
}
Messages postés
207
Date d'inscription
jeudi 3 avril 2003
Statut
Membre
Dernière intervention
2 novembre 2006

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.
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
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
Messages postés
207
Date d'inscription
jeudi 3 avril 2003
Statut
Membre
Dernière intervention
2 novembre 2006

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();

}
Messages postés
207
Date d'inscription
jeudi 3 avril 2003
Statut
Membre
Dernière intervention
2 novembre 2006

ça va être chaud à changer, mais bon, si on n'a pas le choix.....

Merci de m'aider vecchio
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Non on a pas le choix ;)
Attention, il faut CPlayer, pas CPlayer*!!
Messages postés
207
Date d'inscription
jeudi 3 avril 2003
Statut
Membre
Dernière intervention
2 novembre 2006

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 ?
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
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
Messages postés
207
Date d'inscription
jeudi 3 avril 2003
Statut
Membre
Dernière intervention
2 novembre 2006

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
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
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
Messages postés
207
Date d'inscription
jeudi 3 avril 2003
Statut
Membre
Dernière intervention
2 novembre 2006

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>...
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
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
Messages postés
207
Date d'inscription
jeudi 3 avril 2003
Statut
Membre
Dernière intervention
2 novembre 2006

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)
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
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
Messages postés
207
Date d'inscription
jeudi 3 avril 2003
Statut
Membre
Dernière intervention
2 novembre 2006

ok, je prendrais donc un vector ou un list, à trier avec std::sort(..) je suppose
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Plutot list::sort
Messages postés
207
Date d'inscription
jeudi 3 avril 2003
Statut
Membre
Dernière intervention
2 novembre 2006

ç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 !