C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Sort STL
Goto page 1, 2, 3  Next
 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
horneta2005@yahoo.fr
Guest





PostPosted: Sat Oct 01, 2005 8:49 pm    Post subject: Sort STL Reply with 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()

Back to top
Stan
Guest





PostPosted: Mon Oct 03, 2005 7:58 am    Post subject: Re: Sort STL Reply with quote




<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





PostPosted: Mon Oct 03, 2005 8:34 am    Post subject: Re: Sort STL Reply with 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
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 Wink... En tout état de cause, ça permet de considérer
réellement les algorithmes eux meme comme des objets.

Back to top
Stan
Guest





PostPosted: Mon Oct 03, 2005 9:03 am    Post subject: Re: Sort STL Reply with quote


"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





PostPosted: Tue Oct 04, 2005 10:01 am    Post subject: Re: Sort STL Reply with quote

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





PostPosted: Tue Oct 04, 2005 11:51 am    Post subject: Re: Sort STL Reply with 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]...

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





PostPosted: Wed Oct 05, 2005 7:42 am    Post subject: Re: Sort STL Reply with quote

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





PostPosted: Wed Oct 05, 2005 11:21 am    Post subject: Re: Sort STL Reply with quote

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





PostPosted: Wed Oct 05, 2005 1:43 pm    Post subject: Re: Sort STL Reply with quote



"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





PostPosted: Wed Oct 05, 2005 4:40 pm    Post subject: Re: Sort STL Reply with quote

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





PostPosted: Wed Oct 05, 2005 4:52 pm    Post subject: Re: Sort STL Reply with quote

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





PostPosted: Wed Oct 05, 2005 5:45 pm    Post subject: Re: Sort STL Reply with quote


"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





PostPosted: Thu Oct 06, 2005 1:48 am    Post subject: Re: Sort STL Reply with quote

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





PostPosted: Thu Oct 06, 2005 1:52 am    Post subject: Re: Sort STL Reply with quote

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





PostPosted: Thu Oct 06, 2005 2:03 am    Post subject: Re: Sort STL Reply with quote

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
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Goto page 1, 2, 3  Next
Page 1 of 3

 
Jump to:  
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


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.