algo copy_if (STL) - C++ - Programmation
Marsh Posté le 21-06-2004 à 23:12:27
avec un algo genre remove_copy_if + un back_inserter
Marsh Posté le 21-06-2004 à 23:13:53
Et bien c'est ce à quoi j'ai pensé en premier et en relisant le manuel de transform, je n'ai pas trouvé la bonne méthode
Marsh Posté le 21-06-2004 à 23:16:42
Comment associer un predicat à tranform/back_inserter ?
Marsh Posté le 21-06-2004 à 23:37:17
Code :
|
bon j'ai pas poussé plus loin l'exemple full stl, il aurait fallut faire la négation. tu vois bien qu'avec un petit algo simple fait maison, on y arrive. la STL n'est pas complète loin de là : il aurait fallut passer par boost pour faire ça un peu plus proprement. y en a marre de pas avoir de begin(tab) et de end(tab) de devoir se taper l'écriture C ...
Marsh Posté le 21-06-2004 à 23:38:21
c'est aussi facile de ne bricoler un petit FilteringOutputIterator auquel cas, un simple std::copy fonctionnera super bien
Marsh Posté le 21-06-2004 à 23:45:22
Bien, la STL manque vraiment d'un copy_if comme tu l'as décrit.
On trouve la définition de FilteringOutputIterator sur SGI ?
Marsh Posté le 21-06-2004 à 23:51:04
Merci pour l'exemple, je range ton copy_if dans ma boite à outils à coté de la STL
Marsh Posté le 21-06-2004 à 23:52:35
nulle part un FilteringOuputIterator, c'est juste un OutputIterator qui filtre ce qu'on lui demande de sortir
Marsh Posté le 22-06-2004 à 00:11:48
Code :
|
Marsh Posté le 22-06-2004 à 07:21:18
Merci pour l'exemple. C'est instructif.
Marsh Posté le 22-06-2004 à 11:34:53
Taz a écrit :
|
La version Stroustrup retourne out à la fin et pas void.
Marsh Posté le 24-06-2004 à 07:39:40
ça me fait une belle jambe ... surtout si tu crois que j'ai besoin d'un livre ou d'une quelconque documentation pour écrire ce genre de chose ...
Marsh Posté le 24-06-2004 à 21:53:40
Comment se passer de l'appel back_inserter() en argument de copy_if ?
Est-ce que passer l'iterateur en référence et fournir un iterateur à l'aide de begin() conviendrait ?
Marsh Posté le 24-06-2004 à 21:58:13
non. il faut fournir un itérateur d'insertion un back/front/<rien> inserter doit donc être utilisé
Marsh Posté le 25-06-2004 à 00:05:15
Taz a écrit : ça me fait une belle jambe ... surtout si tu crois que j'ai besoin d'un livre ou d'une quelconque documentation pour écrire ce genre de chose ... |
C'est pas ma faute si t'es nul en C++
Marsh Posté le 25-06-2004 à 14:45:16
Taz a écrit : désolé, j'ai rien pour relever |
Ta réaction était tellement stupide que j'ai essayé de l'être encore plus. Ma réponse s'adressait à personne en particulier, c'était dans un but de précision. Maitenant si tu te vexe parce qu'on post une remarque sur ton code, t'as qu'à créer une catégorie Taz où y'a que toi qui a le droit de répondre. Ta susceptibilité à 2 balles tu peux te la garder.
C'est pas tout d'avoir le style grande gueule, faut pas venir pleurnicher quand ça t'arrives.
Marsh Posté le 25-06-2004 à 15:02:49
je sais pas ou t'as vu que je pleurnichais... mais bon si ça t'amuse que penser que je suis un capricieux caractériel qui gueule sur les autres mais qui rentre pleurer chez ça mère dès qu'on lui quelque chose ...
d'ailleurs j'ai toujours pas compris ton intervention ...
Marsh Posté le 27-06-2004 à 01:04:42
Y'a rien à comprendre. Le but était de compléter ta réponse initiale.
Marsh Posté le 11-08-2004 à 01:30:30
J'ai adapté le code de copy_if pour réaliser un algo légèrement différent. Il s'agit cette fois de copier les éléments d'un conteneur vers un autre en fonction du type de leurs éléments.
Concrètement, je construit une list<D*> à partir des éléments d'une list<B*> si la conversion B* vers D* est possible.
Cela semble foncitonner correctement :
Code :
|
L'utilisation de cette algo est équivalente aux exemples précédents du post : transform_if_type<D*>( .., .., back.. );
Par contre, je me demande si je ne suis pas encore passé à coté d'un algo plus simple, plus évident.
Marsh Posté le 11-08-2004 à 07:33:02
ça peut aller ça. sauf niveau typage, c'est un joyeux bordel pour deviner qui est qui, le problème étant que rien ne mets en relation OutputIterator et T, tu es donc obligé de le spécifier. donc veille bien à utilise ::value_type.
transform_if_is_instance est plus correct
l'important ce que ça te satisfasse
Marsh Posté le 11-08-2004 à 18:07:07
En reformulant qq peu les types, j'obtiens un algo assez spécialisé. Le compilateur refuse de templatiser le de conteneur, dommage! Sinon j'obtiens un warning du genre : `typename std::list<TB*, std::allocator<TB*>>::const_iterator' is implicitly a typename
Code :
|
--edit1 : correction warning / ajout de typename.
--edit2 : retrait spécialisation / ajout template template.
Marsh Posté le 11-08-2004 à 18:27:30
utilise typename (voir mon topic)
bah y a pas besoin de restreindre a std::list
Marsh Posté le 11-08-2004 à 19:12:14
ok pour typename.
Comment faire pour eviter la spécialisation ?
Marsh Posté le 11-08-2004 à 19:17:33
C'est bien ce dont j'ai besoin ! Je ne pensais pas que c'etait possible... je vais essayer de trouver.
Marsh Posté le 11-08-2004 à 19:28:49
Voila ! Dans le template template, typename ne peut pas être utilisé...bizarre.
Marsh Posté le 11-08-2004 à 20:01:47
Je suis impresionné ...
Un jour j'y arriverai à comprendre comment fonctionne les templates !
Enfin peut-être ..
Marsh Posté le 21-06-2004 à 23:07:46
Pouvez vous m'aider à completer ce fragment de code.
Il me semble que cela est possible en une seule instruction mais je ne me rappelle plus comment faire.
Message édité par xterminhate le 11-08-2004 à 01:33:33
---------------
Cordialement, Xterm-in'Hate...