 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
horneta2005@yahoo.fr Guest
|
Posted: Sat Oct 01, 2005 8:49 pm Post subject: Sort STL |
|
|
j essaye de mettre en ouvre une fonction de comparaison pour
std::sort mais d apres les exemple que j ai vu je ne comprend pas
leur fonctionnement notament le role de opeator()
|
|
| Back to top |
|
 |
Stan Guest
|
Posted: Mon Oct 03, 2005 7:58 am Post subject: Re: Sort STL |
|
|
<horneta2005 (AT) yahoo (DOT) fr> a écrit dans le message de news:
[email]1128199776.486400.299850 (AT) g44g2000cwa (DOT) googlegroups.com[/email]...
| Quote: | j essaye de mettre en ouvre une fonction de comparaison pour
std::sort mais d apres les exemple que j ai vu je ne comprend pas
leur fonctionnement notament le role de opeator()
|
L'opérateur ( ) permet à un objet d'être utilisé comme une fonction :
par ex, dans :
for_each( l.begin( ), l.end( ) , f );
c'est f ( ) qui sera appelé.
Cela permet d'avoir un moyen générique d'effectuer un traitement.
--
-Stan
|
|
| Back to top |
|
 |
meow Guest
|
Posted: Mon Oct 03, 2005 8:34 am Post subject: Re: Sort STL |
|
|
Si j'ai bien tout compris, l'opérateur () c'est une astuce qui permet
de 'transformer' les fonctions en objets... En C tu passerais un
pointeur de fonction, en C++ tu passes un 'objet fonction', c.à.d un
objet pour lequel l'opérateur () a été redéfini.
L'intérret ? Bein... J'imagine que c'est de pouvoir profiter du typage
et des autres avantages liés à l'objet et que je n'ai pas encore bien
compris ... En tout état de cause, ça permet de considérer
réellement les algorithmes eux meme comme des objets.
|
|
| Back to top |
|
 |
Stan Guest
|
Posted: Mon Oct 03, 2005 9:03 am Post subject: Re: Sort STL |
|
|
"meow" <ben (AT) agat (DOT) net> a écrit dans le message de news:
[email]1128328468.039148.233590 (AT) o13g2000cwo (DOT) googlegroups.com[/email]...
| Quote: | Si j'ai bien tout compris, l'opérateur () c'est une astuce qui permet
de 'transformer' les fonctions en objets... En C tu passerais un
|
Plutôt l'inverse : utiliser des objet comme des fonctions.
| Quote: | L'intérret ? Bein... J'imagine que c'est de pouvoir profiter du typage
et des autres avantages liés à l'objet et que je n'ai pas encore bien
|
Il y a plusieurs avantages, l'un d'eux est de pourvoir
travailler sur des résultats intermédiaires qui sont stockés dans l'objet.
Un autre est d'avoir une fonction paramètrable ( lors de la construction de
l'objet ).
Il doit y en avoir d'autres encore...
--
-Stan
|
|
| Back to top |
|
 |
kanze Guest
|
Posted: Tue Oct 04, 2005 10:01 am Post subject: Re: Sort STL |
|
|
Stan wrote:
| Quote: | "meow" <ben (AT) agat (DOT) net> a écrit dans le message de news:
[email]1128328468.039148.233590 (AT) o13g2000cwo (DOT) googlegroups.com[/email]...
Si j'ai bien tout compris, l'opérateur () c'est une astuce
qui permet de 'transformer' les fonctions en objets... En C
tu passerais un
Plutôt l'inverse : utiliser des objet comme des fonctions.
L'intérret ? Bein... J'imagine que c'est de pouvoir profiter
du typage et des autres avantages liés à l'objet et que je
n'ai pas encore bien
Il y a plusieurs avantages, l'un d'eux est de pourvoir
travailler sur des résultats intermédiaires qui sont stockés
dans l'objet. Un autre est d'avoir une fonction paramètrable (
lors de la construction de l'objet ).
|
Je ne comprends pas trop ce deuxième. On peut très bien utilise
un pointeur à fonction, genre :
bool isLessThan( MyType const& lhs, MyType const& rhs ) ;
std::vector< MyType > v ;
std::sort( v.begin(), v.end(), isLessThan ) ;
| Quote: | Il doit y en avoir d'autres encore...
|
Curieusement : la vitesse. Une fonction comme std::sort ou une
classe comme std::set s'instancie sur un type, non une valeur.
Ici, le type est bool (*)( MyType const&, MyType const& ). Ce
qui ne dit rien au compilateur sur la fonction même ; du coup,
le compilateur doit générer un appel indirect à chaque
comparaison. (En principe, l'optimisateur pourrait l'éliminer,
mais dans la pratique...) Tandis qu'avec l'objet, la fonction
appelée dépend uniquement du type d'instantiation, et non de sa
valeur. Du coup, le compilateur peut générer l'appel statique,
voire même générer la fonction inline le cas échéant.
Aussi, dans le cas des collections comme std::set, tu n'as pas
besoin de fournir une valeur. Si tu veux utliser une fonction,
il faudrait déclarer l'ensemble comme :
std::set< MyType, bool (*)( MyType const&, MyType const& ) >
aSet( isLessThan ) ;
--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
|
|
| Back to top |
|
 |
Stan Guest
|
Posted: Tue Oct 04, 2005 11:51 am Post subject: Re: Sort STL |
|
|
"kanze" <kanze (AT) gabi-soft (DOT) fr> a écrit dans le message de news:
[email]1128416997.669507.222720 (AT) g43g2000cwa (DOT) googlegroups.com[/email]...
| Quote: | Il y a plusieurs avantages, l'un d'eux est de pourvoir
travailler sur des résultats intermédiaires qui sont stockés
dans l'objet. Un autre est d'avoir une fonction paramètrable (
lors de la construction de l'objet ).
Je ne comprends pas trop ce deuxième. On peut très bien utilise
un pointeur à fonction, genre :
bool isLessThan( MyType const& lhs, MyType const& rhs ) ;
std::vector< MyType > v ;
std::sort( v.begin(), v.end(), isLessThan ) ;
|
Comment fait-on avec une fonction pour avoir
l'équivalent de : std::sort( v.begin(), v.end(), isLessThan( myValue ) ) ?
--
-Stan
|
|
| Back to top |
|
 |
kanze Guest
|
Posted: Wed Oct 05, 2005 7:42 am Post subject: Re: Sort STL |
|
|
Stan wrote:
| Quote: | "kanze" <kanze (AT) gabi-soft (DOT) fr> a écrit dans le message de news:
[email]1128416997.669507.222720 (AT) g43g2000cwa (DOT) googlegroups.com[/email]...
Il y a plusieurs avantages, l'un d'eux est de pourvoir
travailler sur des résultats intermédiaires qui sont
stockés dans l'objet. Un autre est d'avoir une fonction
paramètrable ( lors de la construction de l'objet ).
Je ne comprends pas trop ce deuxième. On peut très bien
utilise un pointeur à fonction, genre :
bool isLessThan( MyType const& lhs, MyType const& rhs ) ;
std::vector< MyType > v ;
std::sort( v.begin(), v.end(), isLessThan ) ;
Comment fait-on avec une fonction pour avoir l'équivalent de :
std::sort( v.begin(), v.end(), isLessThan( myValue ) ) ?
|
On ne fait pas.
Enfin, on pourrait écrire une fonction de comparaison qui
utilisait une variable globale, et y mettre myValue. Mais dans
ce cas-là, c'est beaucoup plus propre d'utiliser un objet
fonctionnel.
Attention quand même avec les objets fonctionnels. Ils vont être
copiés à droit et à gauche. Ce qui veut dire que si tu veux
qu'ils utilisent un état évolutif, il faut s'arranger pour que
toutes les instances en partagent cet état.
--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
|
|
| Back to top |
|
 |
Fabien LE LEZ Guest
|
Posted: Wed Oct 05, 2005 11:21 am Post subject: Re: Sort STL |
|
|
On 5 Oct 2005 00:42:26 -0700, "kanze" <kanze (AT) gabi-soft (DOT) fr>:
| Quote: | Attention quand même avec les objets fonctionnels. Ils vont être
copiés à droit et à gauche.
|
Donc, pas de fonctions virtuelles...
| Quote: | Ce qui veut dire que si tu veux
qu'ils utilisent un état évolutif,
|
N'est-ce pas a priori une mauvaise idée de toutes façons, puisqu'on
n'est jamais trop sûr à l'avance de l'ordre dans lequel les éléments
seront traités ?
|
|
| Back to top |
|
 |
Stan Guest
|
Posted: Wed Oct 05, 2005 1:43 pm Post subject: Re: Sort STL |
|
|
"Fabien LE LEZ" <gramster (AT) gramster (DOT) com> a écrit dans le message de
news:ond7k117qe5kb5k3l597bcik7qtu6775ri (AT) 4ax (DOT) com...
| Quote: | On 5 Oct 2005 00:42:26 -0700, "kanze" <kanze (AT) gabi-soft (DOT) fr>:
Attention quand même avec les objets fonctionnels. Ils vont être
copiés à droit et à gauche.
Donc, pas de fonctions virtuelles...
Ce qui veut dire que si tu veux
qu'ils utilisent un état évolutif,
N'est-ce pas a priori une mauvaise idée de toutes façons, puisqu'on
n'est jamais trop sûr à l'avance de l'ordre dans lequel les éléments
seront traités ?
|
Si l'ordre a de l'importance, il suffit ( si c'est possible ) de trier
avec le prédicat qui convient.
Si l'opération est commutative, le pb ne se pose pas, l'exemple
typique est la sommation :
TSum sum(0);
for_each( v.begin( ), v.end( ), sum );
std::cout << "total: " << sum.res( ) << std::endl;
Ce serait dommage de s'en priver.
--
-Stan
|
|
| Back to top |
|
 |
kanze Guest
|
Posted: Wed Oct 05, 2005 4:40 pm Post subject: Re: Sort STL |
|
|
Fabien LE LEZ wrote:
| Quote: | On 5 Oct 2005 00:42:26 -0700, "kanze" <kanze (AT) gabi-soft (DOT) fr>:
Attention quand même avec les objets fonctionnels. Ils vont
être copiés à droit et à gauche.
Donc, pas de fonctions virtuelles...
Ce qui veut dire que si tu veux qu'ils utilisent un état
évolutif,
N'est-ce pas a priori une mauvaise idée de toutes façons,
puisqu'on n'est jamais trop sûr à l'avance de l'ordre dans
lequel les éléments seront traités ?
|
Si la fonction accepte un forward iterator (voire même un input
iterator), et tu lui files un forward iterator, tu sais bien
dans quel ordre les éléments seront traités. Dans certaines
fonctions, aussi, il est dit qu'elle renvoie un itérateur au
*premier* élément, avec parfois des exigeances de complexité qui
ne permettent que de visiter les éléments dans l'ordre. Et
enfin, for_each garantit explicitement l'ordre.
--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
|
|
| Back to top |
|
 |
kanze Guest
|
Posted: Wed Oct 05, 2005 4:52 pm Post subject: Re: Sort STL |
|
|
Fabien LE LEZ wrote:
| Quote: | On 5 Oct 2005 00:42:26 -0700, "kanze" <kanze (AT) gabi-soft (DOT) fr>:
Attention quand même avec les objets fonctionnels. Ils vont
être copiés à droit et à gauche.
Donc, pas de fonctions virtuelles...
Ce qui veut dire que si tu veux
qu'ils utilisent un état évolutif,
N'est-ce pas a priori une mauvaise idée de toutes façons,
puisqu'on n'est jamais trop sûr à l'avance de l'ordre dans
lequel les éléments seront traités ?
|
Il me vient à l'ésprit que c'est pas bête ce que tu dis. Imagine
que tu veux trouver le premier élément dans un tableau d'entiers
qui s'écarte de plus de N du moyen vu jusqu'à là. On aurait
donc:
class CondImpl
{
public:
explicit CondImpl( int limit )
: myLimit( limit )
, myCount( 0 )
, myTotal( 0 )
{
}
bool operator()( int elem )
{
myTotal += elem ;
++ myCount ;
return abs( myTotal / myCount - elem ) > myLimit ;
}
private:
int myLimit ;
size_t myCount ;
int myTotal ;
} ;
class Cond
{
public:
explicit Cond( CondImpl* impl )
: myImpl( imple )
{
}
bool operator()( int elem ) const
{
return (*myImpl)( elem ) ;
}
private:
CondImpl* myImpl ;
}
bool
dataOK( std::vector< int > const& v )
{
static int const limit = 5 ;
CondImpl c ;
return std::find_if( v.begin(), v.end(), Cond( &c ) ) ==
v.end() ;
}
Est-ce qu'il serait légal ? Est-ce qu'il doit l'être ?
Suppose que je remplace les v.begin() par un itérateur wrapper
qui n'est que forward iterator. Est-ce que ça influe sur la
légalité ?
--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
|
|
| Back to top |
|
 |
Stan Guest
|
Posted: Wed Oct 05, 2005 5:45 pm Post subject: Re: Sort STL |
|
|
"kanze" <kanze (AT) gabi-soft (DOT) fr> a écrit dans le message de
news:1128531140.476192.67280 (AT) g44g2000cwa (DOT) googlegroups.com...
| Quote: | bool
dataOK( std::vector< int > const& v )
{
static int const limit = 5 ;
CondImpl c ;
return std::find_if( v.begin(), v.end(), Cond( &c ) ) ==
v.end() ;
}
|
CondImpl c(limit) ; // je suppose
--
-Stan
|
|
| Back to top |
|
 |
Fabien LE LEZ Guest
|
Posted: Thu Oct 06, 2005 1:48 am Post subject: Re: Sort STL |
|
|
On 5 Oct 2005 09:52:20 -0700, "kanze" <kanze (AT) gabi-soft (DOT) fr>:
[...
Si j'en crois <http://www.sgi.com/tech/stl/find_if.html> :
- le prédicat doit être appelé au plus une fois sur chaque
élément ;
- l'itérateur renvoyé est le premier à satisfaire le prédicat ;
- et j'ai l'impression que c'est à peu près tout.
Imaginons un instant l'implémentation suivante de find_if :
InputIterator reponse= last;
Je crée un std::vector<InputIterator>, et je le remplis avec les
itérateurs (ce qui permet de transformer les itérateurs "forward" en
"random") ;
Je parcours ce tableau à l'envers ; si le prédicat renvoie true,
j'assigne ce InputIterator à "reponse" ;
Je renvoie "reponse".
Il me semble que cette implémentation :
- n'utilise que le fait que InputIterator est un "forward" ;
- appelle au plus une fois (en fait, exactement une fois) le
prédicat sur chaque élément ;
- renvoie le premier élément qui satisfasse au prédicat ;
- empêche ton prédicat "Comp" de fonctionner.
|
|
| Back to top |
|
 |
Fabien LE LEZ Guest
|
Posted: Thu Oct 06, 2005 1:52 am Post subject: Re: Sort STL |
|
|
On 5 Oct 2005 09:52:20 -0700, "kanze" <kanze (AT) gabi-soft (DOT) fr>:
| Quote: | Est-ce qu'il serait légal ? Est-ce qu'il doit l'être ?
|
Pourrais-tu m'expliquer la nuance entre ces deux questions ?
|
|
| Back to top |
|
 |
Fabien LE LEZ Guest
|
Posted: Thu Oct 06, 2005 2:03 am Post subject: Re: Sort STL |
|
|
On Wed, 5 Oct 2005 15:43:00 +0200, "Stan" <(remove 1,2,3)
[email]z1y2lo3g (AT) club-internet (DOT) fr[/email]>:
| Quote: | Si l'opération est commutative, le pb ne se pose pas, l'exemple
typique est la sommation :
TSum sum(0);
for_each( v.begin( ), v.end( ), sum );
|
Mauvais contre-exemple AMHA :
- for_each donne, contrairement à d'autres algorithmes, une
garantie sur l'ordre de traitement ;
- la sommation n'est pas forcément commutative
(std::string::operator+ par exemple).
|
|
| 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
|
|