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

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
12
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
12
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
12
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
12
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
12
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
12
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
12
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
12
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
12
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
12
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