std::list liste.sort(); - C++ - Programmation
Marsh Posté le 25-11-2002 à 21:34:22
Tu peux definir:
Code :
|
puis
Code :
|
LeGreg
Marsh Posté le 25-11-2002 à 21:42:19
Et pour que ce soit dans l'ordre inverse
tu remplaces MyGreater par la fonction inverse
A+
LeGreg
Marsh Posté le 25-11-2002 à 21:46:31
Taz@PPC a écrit a écrit : y a pas de methode std::list::sort dans STL confond pas tout. utilises std::sort |
ca va toi??
LeGreg
Marsh Posté le 25-11-2002 à 21:55:18
Taz@PPC a écrit a écrit : y a pas de methode std::list::sort dans STL confond pas tout. utilises std::sort |
tu ne peux pas utiliser sort d'algorithm
sur des listes mais tu devais surement savoir ca..
LeGreg
Marsh Posté le 25-11-2002 à 22:08:32
legreg a écrit a écrit : tu ne peux pas utiliser sort d'algorithm sur des listes mais tu devais surement savoir ca.. LeGreg |
oui je me suis mal exprimé et c'est vrai que j'ai pas les yeux en face des trous apres 7 parties de War3 d'affilées ( ).
y a bien une std::list<T>::sort() et une std::list<T>::sort(Predicat)
std::list<T>::sort() <=> std::list<T>::sort(std::less<T>())
comme chacun sait on ne peut utiliser std::sort sur une std::list car std::sort a besoin de RandomAccessIterator que ne peut fournir une std::list
Marsh Posté le 26-11-2002 à 21:23:00
Taz@PPC a écrit a écrit : oui je me suis mal exprimé et c'est vrai que j'ai pas les yeux en face des trous apres 7 parties de War3 d'affilées ( ). |
Tu t'es planté, c'est tout
Marsh Posté le 21-10-2009 à 17:54:08
Salut, dsl de détérer le sujet mais j'ai un problème très semblable. Impossible de faire fonctionner mon opérateur sort :
Code :
|
lorsque j'utilise sort sur ma list<Noeud *>,il ne se passe rien.
Quelqu'un pourrait me dire ce que j'ai louper ?
merci
Marsh Posté le 22-10-2009 à 00:29:52
il se passe rien, en effet ce n'est pas très clair.
j'ai une list<Noeud *> que je remplis (avec les libelle dans un desordre alphabetique)
j'affiche ma liste -> tout est Ok elle est dans le desordre (ordre dans lequel je l'ai rentré)
je la sort puis la ré affiche -> l'ordre est toujours le meme
d'ou le il ne se passe rien.
Je poste l'exemple complet demain matin, parce que la ca doit manquer d'info utile pour vraiment voir le probleme.
a demain
Marsh Posté le 22-10-2009 à 08:47:26
Une liste de pointeurs sera triee avec l'ordre definis sur les pointeurs, pas sur les objets pointes si tu ne specifies pas explicitement la fonction de comparaisons a utiliser.
Marsh Posté le 22-10-2009 à 10:37:15
Code :
|
Voila le retour dans la console :
Code :
|
Marsh Posté le 22-10-2009 à 10:51:56
Un Programmeur a écrit : Une liste de pointeurs sera triee avec l'ordre definis sur les pointeurs, pas sur les objets pointes si tu ne specifies pas explicitement la fonction de comparaisons a utiliser. |
Comment je peux spécifier cette fonction pour trier ma liste à mon gout ?
Marsh Posté le 22-10-2009 à 10:55:05
tu peux appeler sort en lui passant en argument un prédicat, c'est ce prédicat qui fera la comparaison comme tu le souhaites entre les noeuds
Edit, juste pour te mâcher le travail au cas où mon explication ne serait pas assez claire :
Code :
|
Au passage, tu noteras que ton tri ne va pas en profondeur, tu ne trie que les fils d'un noeud, pas les petits fils.
Edit : const
Marsh Posté le 22-10-2009 à 11:36:21
merci de m'éclairer, j avoue que je suis dépassé mais je pense que tu l'as remarqué
j'avais déjà essayer la même chose, le problème c'est que je ne peux pas l'utiliser dans ma classe noeud (en tout cas je n'ai pas réussi)
merci pour ta patience
Marsh Posté le 22-10-2009 à 16:59:37
Taz a écrit : des const s'il vous plait ! |
Here you are, my lord.
TheSamFrom1984 a écrit : |
merci pour la contribution
Marsh Posté le 23-10-2009 à 19:53:13
Bonjours tout le monde malgré vos remarques dure (méchante ?) mais surement mérité je reviens
Alors j'ai pas mal avancé depuis la dernière fois mais j'ai changé mon fusil d'épaule pour le tri, maintenant j'eesaie d'insérer les élément directement à la bonne place plutôt que de trier, mais ca mache pas beaucoup mieux
Code :
|
Code :
|
résultat console :
Code :
|
Je n'arrive pas à trouver le fonctionnement des iterateurs.
merci ++
Marsh Posté le 24-10-2009 à 14:49:31
forcément, tu compares encore et toujours des pointeurs ...
Nous ne sommes pas méchants, mais tu dois comprendre que :
Code :
|
ne fait pas du tout la même chose que :
Code :
|
Dans le premier cas, tu vas bien comparer tes instances de Noeud, dans le deuxième, tu vas comparer leur adresse mémoire !
Vérifie ce que tu manipules, quand tu as un itérateur ...
sinon, pour rechercher un itérateur dans un conteneur sur lequel tu peux itérer, tu devrais plutôt passer par un std::find_if et lui passer le prédicat qui va bien (je t'invite à jeter un oeil à bind2nd si tu t'y lances)
Marsh Posté le 24-10-2009 à 17:14:33
ok, cette fois je pense que j'ai compris, j'ai lu de la doc sur les iterateur et c'est un peu plus clair. une dernière question en ce qui concerne le destructeur de ma classe :
Code :
|
Est ce vraiment utile de le préciser ou c'est deja ce que fait le destructeur par defaut ? si c'est utile est ce efficace ? je ne me rend pas compte si toute les génération vont être supprimer.
Marsh Posté le 24-10-2009 à 17:48:48
tu as fait à peu de choses près ce qu'un destructeur généré aurait fait, et, dans ton cas, ca ne revient pas du tout à ce que tu devrais faire. Sache qu'à tout appel à new doit correspondre un appel à delete, sans quoi, tu vas avoir une fuite mémoire. A toi de déterminer qui a la responsabilité de libérer des instances de Noeud (bien souvent, pour des raisons de symétrie, on a tendance à préférer que ce soit celui qui a alloué qui libère aussi la donnée)
Marsh Posté le 24-10-2009 à 18:29:10
Je tendrais vers quelquechose comme ca :
Code :
|
si j'ai bien comprise fils.erase doit appeler le destructeur de noeud à chaque fois, le problème c'est que je ne vois pas comment faire intervenir un delete dans la boucle pour equilibre les new/delete.
Marsh Posté le 24-10-2009 à 19:01:29
vuq ue tu manipules des pointeurs, ta liste ne va jamais se charger de les libérer pour toi, donc soit tu fais une boucle pour itérer sur la liste et détruire les objets pointés dans ton destructeur (auquel cas, il faut que tu croises les doigts pour que personne n'aie gardé de référence) soit être parti au départ sur une liste de pointeurs plutôt que directement une liste de Noeud, ce n'était peut-être pas une bonne idée. A toi de voir.
Marsh Posté le 24-10-2009 à 19:54:40
theshockwave a écrit : vuq ue tu manipules des pointeurs, ta liste ne va jamais se charger de les libérer pour toi, donc soit tu fais une boucle pour itérer sur la liste et détruire les objets pointés dans ton destructeur (auquel cas, il faut que tu croises les doigts pour que personne n'aie gardé de référence) soit être parti au départ sur une liste de pointeurs plutôt que directement une liste de Noeud, ce n'était peut-être pas une bonne idée. A toi de voir. |
Faut voir à faire els choses proprement. Le mieux ets d'avoir une std::list de shared_ptr ou equivalent.
Ca limitera les pb d'ownership
Marsh Posté le 25-11-2002 à 21:24:40
Bonsoir,
j'ai declaré une liste a partir de la STL. C'est une liste du type d'une classe.
===> list<NomDeClasse> liste;
j'aimerais faire un sort de cette liste grace a la methode sort fournie dans la class list de c++ builder.
Comment faire pour que la liste soit trié suivant un champ (string) se trouvant dans ma classe.
On m'a dit qu'il fallait surcharger l'operateur < mais je vois pas comment faire !!!
Merci de m'aider.
Bonne soirée