 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Fabien SK Guest
|
Posted: Fri Sep 12, 2003 10:03 am Post subject: Re: problèmes avec algo generique ( find (); ) |
|
|
Geoffroy Baud wrote:
| Quote: | Bonjour,
j ai une liste qui contient des pointeur sur une struct
dans ma struct j ai un champ de type int
et je voudrais pouvoir faire un find sur ce int pour
voir s'il corespond ou pas a ma recherche ... ?
|
Pas "find" mais "find_if"
// ta structure
struct Toto
{
Toto(int val):m_Val(val), m_Val2(val*2){}
int m_Val;
int m_Val2;
};
// une structure prédicat qui compare le nombre
// cherché avec un "Toto*". Se comporte comme une fonction
struct is_equal
{
is_equal(int searched):m_Searched(searched){}
bool operator()(Toto *ptoto){ return ptoto->m_Val==m_Searched; }
int m_Searched;
};
int main(int argc, char *argv[])
{
typedef std::list<Toto*> TotoList;
TotoList lst;
lst.push_back(new Toto(1));
lst.push_back(new Toto(2));
lst.push_back(new Toto(3));
TotoList::iterator it = std::find_if(lst.begin(), lst.end(),
is_equal(2));
if (it!=lst.end())
std::cout << (*it)->m_Val2 << std::endl;
return 0;
}
| Quote: |
es-ce possible ?
si oui avez vous un lien sur une doc ?
si non avez vous un lien sur une doc qui pourrais m expliquer
comment faire ?
merci ...
j ai bien essayer de chercher dans Primer C++ de lipmann ...
mais je dois reconnaitre que je n ai rien compris :(
merci
|
|
|
| Back to top |
|
 |
Geoffroy Baud Guest
|
Posted: Fri Sep 12, 2003 10:08 am Post subject: Re: problèmes avec algo generique ( find (); ) |
|
|
Fabien SK wrote:
| Quote: | Geoffroy Baud wrote:
Bonjour,
j ai une liste qui contient des pointeur sur une struct
dans ma struct j ai un champ de type int
et je voudrais pouvoir faire un find sur ce int pour
voir s'il corespond ou pas a ma recherche ... ?
Pas "find" mais "find_if"
// ta structure
struct Toto
{
Toto(int val):m_Val(val), m_Val2(val*2){}
int m_Val;
int m_Val2;
};
// une structure prédicat qui compare le nombre
// cherché avec un "Toto*". Se comporte comme une fonction
struct is_equal
{
is_equal(int searched):m_Searched(searched){}
bool operator()(Toto *ptoto){ return ptoto->m_Val==m_Searched; }
int m_Searched;
};
int main(int argc, char *argv[])
{
typedef std::list<Toto*> TotoList;
TotoList lst;
lst.push_back(new Toto(1));
lst.push_back(new Toto(2));
lst.push_back(new Toto(3));
TotoList::iterator it = std::find_if(lst.begin(), lst.end(),
is_equal(2));
if (it!=lst.end())
std::cout << (*it)->m_Val2 << std::endl;
return 0;
}
es-ce possible ?
si oui avez vous un lien sur une doc ?
si non avez vous un lien sur une doc qui pourrais m expliquer
comment faire ?
merci ...
j ai bien essayer de chercher dans Primer C++ de lipmann ...
mais je dois reconnaitre que je n ai rien compris :(
merci
|
merci bcp;
--
-------------------------------------------------------------------
Geoffroy Baud [email]geoffroy.baud (AT) wanadoo (DOT) fr[/email]
0AE5 7A1B 527D 3966 8EBE 2EC0 AA79 EB54 7D7D 7CEC
-------------------------------------------------------------------
|
|
| Back to top |
|
 |
Fabien SK Guest
|
Posted: Fri Sep 12, 2003 10:34 am Post subject: Re: problèmes avec algo generique ( find (); ) |
|
|
Geoffroy Baud wrote:
| Quote: | Fabien SK wrote:
[...]
merci bcp;
|
Note: tu n'es pas obligé de recopier tout mon message (plus de 50
lignes) pour juste rajouter un "merci". Il y a une FAQ qui dit comment
bien poster, mais je ne connais pas l'URL...
|
|
| Back to top |
|
 |
Fabien LE LEZ Guest
|
Posted: Fri Sep 12, 2003 3:35 pm Post subject: Re: problèmes avec algo generique ( find (); ) |
|
|
On Fri, 12 Sep 2003 12:34:36 +0200, Fabien SK <fabsk+news (AT) free (DOT) fr>
wrote:
| Quote: | Il y a une FAQ qui dit comment
bien poster, mais je ne connais pas l'URL...
|
<http://www.giromini.org/usenet-fr/repondre.html>, quand le bon sens
ne suffit pas...
|
|
| Back to top |
|
 |
Geoffroy Baud Guest
|
Posted: Fri Sep 12, 2003 4:34 pm Post subject: Re: problèmes avec algo generique ( find (); ) |
|
|
Fabien SK wrote:
| Quote: | Geoffroy Baud wrote:
Fabien SK wrote:
[...]
merci bcp;
Note: tu n'es pas obligé de recopier tout mon message (plus de 50
lignes) pour juste rajouter un "merci". Il y a une FAQ qui dit comment
bien poster, mais je ne connais pas l'URL...
|
oups, je me suis fais une merde ...
desolé.
Et d'ailleur pendant que j'y suis un grand merci
aux personnes qui maintiennent la FAQ.
--
-------------------------------------------------------------------
Geoffroy Baud [email]geoffroy.baud (AT) wanadoo (DOT) fr[/email]
0AE5 7A1B 527D 3966 8EBE 2EC0 AA79 EB54 7D7D 7CEC
-------------------------------------------------------------------
|
|
| Back to top |
|
 |
Geoffroy Baud Guest
|
Posted: Mon Sep 15, 2003 6:39 am Post subject: Re: problèmes avec algo generique ( find (); ) |
|
|
Samuel Krempp wrote:
| Quote: | ou alors, avec Boost lambda. tu n'as pas besoin de créer une classe pour
chaque nouvelle opération :
#include
#include
|
Bonjour,
je lis souvent des postes qui parle de
Boost lambda, font-elle partie de la norme ?
Sont-elles portables ?
Qu'apportent-elles de plus ?
Merci
--
-------------------------------------------------------------------
Geoffroy Baud [email]geoffroy.baud (AT) wanadoo (DOT) fr[/email]
0AE5 7A1B 527D 3966 8EBE 2EC0 AA79 EB54 7D7D 7CEC
-------------------------------------------------------------------
|
|
| Back to top |
|
 |
Samuel Krempp Guest
|
Posted: Mon Sep 15, 2003 8:56 am Post subject: Re: problèmes avec algo generique ( find (); ) |
|
|
le Monday 15 September 2003 08:39, [email]geoffroy.baud (AT) wanadoo (DOT) fr[/email] écrivit :
| Quote: | Samuel Krempp wrote:
ou alors, avec Boost lambda. tu n'as pas besoin de créer une classe pour
chaque nouvelle opération :
#include
#include
Bonjour,
je lis souvent des postes qui parle de
Boost lambda, font-elle partie de la norme ?
Sont-elles portables ?
Qu'apportent-elles de plus ?
Merci
|
pas de la norme, mais de Boost ([url]www.boost.org)[/url], et je crois que l'auteur de
boost lambda voudrait que la norme intègre le support des expressions
lambda (ça permetterait de dépasser des limitations pour les lambda)
elles sont portables, sur les compilos qui sont assez conformes à la norme
tu peux regarder les échecs de ses tests selon compilateur sur
http://boost.sourceforge.net/regression-logs/
Quant à leur interêt, c'est comme je le disais, ça permet simplement
d'écrire en une ligne un objet fonction grâce à une syntaxe reprenant le
principe des epxressions lambda. Au lieu d'avoir à définir une classe pour
faire le foncteur voulu selon besoin (ou de faire de très longues
expressions à base des foncteurs std et de bind1st, bind2nd, etc..)
c pas le jour et la nuit, mais bon, ça peut être utile si on se met à
utiliser des fonctions génériques prenant une fonction en argument (comme
std::for_each, find_if, accumulate, transform, ou des fonctions perso)
--
Sam
|
|
| Back to top |
|
 |
Samuel Krempp Guest
|
Posted: Mon Sep 15, 2003 9:31 am Post subject: Re: problèmes avec algo generique ( find (); ) |
|
|
le Monday 15 September 2003 10:54, [email]kanze (AT) gabi-soft (DOT) fr[/email] écrivit :
| Quote: | Dans le cas de Boost lambda, pas grand chose en fait. D'une part, c'est
impressionnant ce qu'ils ont réussi à faire sans l'aide du langage
propre, mais de l'autre, c'est un problème du language, et non de la
bibliothèque, et dans la pratique, il y a toujours une ou deux choses
qu'il te faut mais qui ne marche pas.
|
le premier inconvénient que j'y ai vu, c'est le nbre de cas particuliers
auxquels on est confronté. par exple l'accès aux membres ne peut pas se
faire par _1.monmembre, et la solution bind(&MaClasse::mommembre, _1)
(ou _1 ->* mommembre ) est incommode lorsque le membre est une fonction
surchargée, auquel cas prendre son adresse nécessite une écriture embêtante
iterator (Maclasse::*pf) () = &Maclasse::begin;
bind(pf, _1, ...
et c'est inévitable sans support du langage (et même avec, ça serait ptet
dur de faire autrement)
C'est vrai qu'il y a des choses qu'on peut pas faire, mais faut vraiment
qque ce soit de chose de compliqué (agir sur les éléments par un container
de containers de containers, par exemple, peut être impossible).
tu as un exemple plus courant en tête ?
--
Sam
|
|
| Back to top |
|
 |
kanze@gabi-soft.fr Guest
|
Posted: Mon Sep 15, 2003 2:21 pm Post subject: Re: problèmes avec algo generique ( find (); ) |
|
|
Samuel Krempp <krempp (AT) crans (DOT) truc.en.trop.ens-cachan.fr> wrote
| Quote: | le Monday 15 September 2003 10:54, [email]kanze (AT) gabi-soft (DOT) fr[/email] écrivit :
Dans le cas de Boost lambda, pas grand chose en fait. D'une part,
c'est impressionnant ce qu'ils ont réussi à faire sans l'aide du
langage propre, mais de l'autre, c'est un problème du language, et
non de la bibliothèque, et dans la pratique, il y a toujours une ou
deux choses qu'il te faut mais qui ne marche pas.
le premier inconvénient que j'y ai vu, c'est le nbre de cas
particuliers auxquels on est confronté. par exple l'accès aux membres
ne peut pas se faire par _1.monmembre, et la solution
bind(&MaClasse::mommembre, _1) (ou _1 ->* mommembre ) est incommode
lorsque le membre est une fonction surchargée, auquel cas prendre son
adresse nécessite une écriture embêtante iterator (Maclasse::*pf) () =
&Maclasse::begin; bind(pf, _1, ...
et c'est inévitable sans support du langage (et même avec, ça serait
ptet dur de faire autrement)
|
Et c'est surtout ça que j'ai voulu dire. C'est un problème langage.
| Quote: | C'est vrai qu'il y a des choses qu'on peut pas faire, mais faut
vraiment qque ce soit de chose de compliqué (agir sur les éléments par
un container de containers de containers, par exemple, peut être
impossible). tu as un exemple plus courant en tête ?
|
Pas vraiment. Il faut dire que je l'ai essayé une ou deux fois, sur des
petits exemples que moi, j'ai considéré simple, et chaque fois, je me
suis heurté à une limitation. D'après ce dont je me souviens, il y avait
des solutions, dans chaque cas (l'utilisation de bind, etc.). Mais en
fin de compte, quand la moitié de l'expression n'est là que pour
contourner les faiblesses de l'outil, on se pose la question.
En revanche, le problème que tu cites me semble grave. Je ne crois pas
qu'il s'est présenté dans mes petits essais, mais dans mes applications,
l'appel à des fonctions membre d'un paramètre arrive souvent.
--
James Kanze GABI Software mailto:kanze (AT) gabi-soft (DOT) fr
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16
|
|
| Back to top |
|
 |
Gabriel Dos Reis Guest
|
Posted: Mon Sep 15, 2003 2:33 pm Post subject: Re: problèmes avec algo generique ( find (); ) |
|
|
Samuel Krempp <krempp (AT) crans (DOT) truc.en.trop.ens-cachan.fr> writes:
| Quote: | le premier inconvénient que j'y ai vu, c'est le nbre de cas particuliers
auxquels on est confronté. par exple l'accès aux membres ne peut pas se
faire par _1.monmembre, et la solution bind(&MaClasse::mommembre, _1)
(ou _1 ->* mommembre ) est incommode lorsque le membre est une fonction
surchargée, auquel cas prendre son adresse nécessite une écriture embêtante
iterator (Maclasse::*pf) () = &Maclasse::begin;
bind(pf, _1, ...
|
nous sommes un certain nombre ,A`(B explorer des choses comme
find_if(lst.begin(), lst.end(), fun (auto x) -> x.m_val == 2);
ou
find_if(lst.begin(), lst.end(), auto (auto x) -> x.m_val == 2);
-- Gaby
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|