qsort trie en Cpp - C++ - Programmation
Marsh Posté le 02-07-2009 à 18:54:17
std::sort avec un foncteur qui va bien ... Je vois pas ou est le probleme
Marsh Posté le 02-07-2009 à 19:17:45
ça peut être une surcharge de l'operator () qui renvoie un int ? pas uniquement un bool ?
Marsh Posté le 02-07-2009 à 19:22:14
euh qsort renvoie un int qui vaut 0 ou 1 car bool n'existe aps en C90 c'est tout ... Un opérateur de comparaison , sémantiquement, ne peut pas renvoyer autre chose ...
Marsh Posté le 02-07-2009 à 19:54:33
hum ah bon, pas sûr du tout, j'ai vue des algo sur le net vite fait, où les mecs renvoyés des valeurs autre que 1 ou 0 dans leur fonction compare
genre là :
http://www.codermind.fr/reponses/C [...] teres.html
Marsh Posté le 02-07-2009 à 20:59:35
Le comparateur attendu par qsort, c'est du 3 voies -- comme strcmp --, plus petit que 0, égal à 0, plus grand que 0.
Le comparateur attendu par std::sort, c'est du deux voies. Si on veut le fabriquer à partir d'un comparateur conçu pour qsort, il faut faire cmp() < 0.
Marsh Posté le 02-07-2009 à 21:30:43
plutot, si j'ai une struct{int,string,string,string} un comparateur deux voies ça suffit pour me trier ça ?
Marsh Posté le 02-07-2009 à 21:44:35
le nombre de voie n'a pas de rapport. Il faut juste que ton oeprator< soit complet pour ton type c'ets tout.
Marsh Posté le 02-07-2009 à 21:52:30
ça m'embrouille tout ça, jss dans le brouilalrd
Marsh Posté le 02-07-2009 à 21:53:53
théorie du tri quoi. Tu peut trier des objets ssi il existe un ordre complet dessus. Donc à toi de trouvé comment à partir des données de ta structure quel calcul mener pr ordonnée 2 instances quelconque. Ton operateur n'a plus alors qu'a renvoyé vrai ou faux.
Marsh Posté le 02-07-2009 à 22:10:59
ben j'aimais assez la solution du lien que j'ai posté, c'était facile quoi, je pense que je vais rester sur le qsort
Marsh Posté le 03-07-2009 à 08:12:25
c'est exactement ce que je disais ...
L'algo mis en lien, il s'ecrit pareil avec sort hein
Marsh Posté le 03-07-2009 à 09:39:58
cmp() est le comparateur a trois voies que tu as deja.
Essayer de programmer en combinant des bouts de code trouves a l'aide de google correspondant a des problemes plus ou moins similaires au tien et en les adaptant en les modifiant au hasard d'apres les reponses a une question mal posee sur des web forums, ca ne va pas d'amener tellement loin.
Il faut comprendre comment ca marche.
Marsh Posté le 03-07-2009 à 12:13:55
ça m'amène une autre question :
- ov est un vector,CompareFunc une focntion membre de Parse
- sort est appelé dans une fonction memebre de Parse
- CompareFunc est du modèle de la fonction cmp dont on parlé plus haut
sa signature est
int Parse::CompareFunc(const Obj& o1,const Obj& o2)
- ov contient des Obj
Code :
|
Le compilo me sort could not deduce argument for mem_fun_ref, je fais quelquechose de pas bien ?
Marsh Posté le 03-07-2009 à 14:52:05
A nouveau, il faut comprendre ce qu'on fait et pas faire des choses au hasard.
Que fait mem_fun_ref? Transformer en un foncteur a deux parametres une fonction membre qui prend un parametre en plus de this. Tu lui passes une fonction membre a deux parametres, ca rale.
Que fait bind1st? Transformer en un foncteur a un parametre un foncteur a deux parametre en fixant le premier.
Autrement dit, la combinaison des deux n'est pas ce que tu veux. Il n'y a rien de standard qui fasse ce que tu veux, tu vas devoir faire un wrapper toi-meme.
En passant, il faut aussi adapter le resultat de la fonction membre. Tu vas pouvoir passer un foncteur retournant un int, mais avec egalite a 0 implicite, pas l'inegalite que tu veux vraisemblablement.
Marsh Posté le 03-07-2009 à 14:57:33
ok merci. toujours là quand on a besoin :^, bon je vais rester sur une fonction non membre , ça fait pas trés encapsulation fashion mais au moins ça marche et c'est simple
Marsh Posté le 02-07-2009 à 18:29:35
salut,
j'ai besoin de faire un tri multi critère en C++.
Quel est l'équivalent du qsort en C++ ?
sort, prend une fonction de type Compare et donc qui return un boolean.
le prototype pour qsort est une fonction qui renvoie un int...
Du coup je ne vois pas quoi utiliser. Boost banned.
Merci