OVH Cloud OVH Cloud

Iterateur perso

23 réponses
Avatar
Aurélien REGAT-BARREL
Bonjour,
Me revoilà avec ma classe Triplet, dans ce genre (pour l'exemple) :

struct Triplet
{
int Values[ 3 ];

Triplet( int A, int B, int C )
{
this->Values[ 0 ] = A;
this->Values[ 1 ] = B;
this->Values[ 2 ] = C;
}
};

J'ai un vector de Triplet, je souhaiterais pouvoir lui appliquer des
algorithm tels que max_element, etc... sur
une dimension données des triplets (index 0, 1 ou 2). Quelle est la
meilleure solution ?
J'ai d'abord pensé à un functor d'accès spécial fourni comme comparateur et
l'utilisation de bind1st pour lui
donner la dimension à manipuler, mais je me suis tourné vers un wrapper
d'iterator :

template<typename T>
template<typename T>
class iter_wrapper
{
public:
iter_wrapper( const T & Iter, int Index ):
iter( Iter ), index( Index ) {}

public:
typedef const iter_wrapper<T> const_iterator;

int operator*() const
{
return this->iter->Values[ this->index ];
}

const_iterator& operator++()
{
++this->iter;
return *this;
}

bool operator!=( const const_iterator & _Right ) const
{
return this->iter != _Right.iter;
}

private:
T iter;
int index;
};

template<typename T>
inline iter_wrapper<T> select_index( const T & Iter, int Index )
{
return iter_wrapper<T>( Iter, Index );
}

int main()
{
std::vector<Triplet> v;
v.push_back( Triplet( 0, 1, 0 ) );
v.push_back( Triplet( 0, 2, 0 ) );
v.push_back( Triplet( 0, 3, 0 ) );


int max_b = *std::max_element(
select_index( v.begin(), 1 ),
select_index( v.end(), 1 ) );
}

Qu'en pensez-vous ?
Merci pour votre aide.

--
Aurélien REGAT-BARREL

10 réponses

1 2 3
Avatar
kanze
drkm wrote in message
news:...

writes:

[...]

J'ai reçu ce message trois fois. Cela fait quelques jours que je
reçois plusieurs de tes messages en double. Je me demande si le
problème est de ton côté ou du mien.


Je poste au moyen de Google ; j'ai l'impression qu'ils ont quelques
problèmes en ce moment.

--
James Kanze GABI Software http://www.gabi-soft.fr
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

Avatar
Michel Michaud
Dans news:,
"Michel Michaud" wrote in message
news:<XVzUc.19799$...
... max_element(v.begin(), v.end(),
TripletEnOrdreDeLaDonnee(0));

... sort(v.begin(), v.end(),
TripletEnOrdreDeLaDonnee(1));


Les algorithmes ne s'intéressent pas qu'à l'ordre (même si
c'était le cas des algorithmes qu'il a cité). Comment ferais-tu
pour std::accumulate le nième élément ?


J'ai répondu à la question demandée, pas à une autre.

[...]
L'utilisation d'une projection, implémentée à travers un
itérateur, est une façon classique dans beaucoup de cercles.


Quand c'est ce dont on a besoin, c'est ce dont on a besoin, mais
les fonctions existantes qui reçoivent des prédicats sont souvent
plus/très simples d'utilisation.

[...]
Je crois, en fait, que boost::transform_iterator est exactement
ce qu'il cherche. Il suffit qu'il écrive un objet fonctionnel
ExtractNth, et le tour est joué.


« Tu crois » ? Donc même s'il peut écrire une fonction objet
toute simple, qui fait le travail, il devrait essayer de voir
si avec une autre et en se tapant la doc de boost, il ne pourrait
pas arriver au même résultat ? C'est amusant et instructif...
Pourquoi faire simple quand on peut faire compliqué... :-)

--
Michel Michaud
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/


Avatar
Michel Michaud
Dans news:41247118$0$8977$, Aurélien
ton « inline » est vraiment inutile...


Je ne saurais pas te dire si c'est une initiative personnelle
et un copier-coller. Mais, après l'avoir enlevé, je voudrais
être sûr de comprendre son inutilité : est-ce bien parce que
comme c'est une fonction membre implémentée à l'intérieur de la
classe elle est déjà inline, ou y'a-t-il autre chose ?


Non, c'est ça. Inutile quand la fonction est définie dans la
classe.

7.1.2p2
A function defined within a class definition is an inline
function. The inline specifier shall not appear on a block
scope function declaration.

Est-ce que ça veut même dire que c'est illégal de le mettre ?

--
Michel Michaud
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/


Avatar
kanze
"Michel Michaud" wrote in message
news:<%G8Wc.6738$...
Dans news:41247118$0$8977$, Aurélien
ton « inline » est vraiment inutile...


Je ne saurais pas te dire si c'est une initiative personnelle et un
copier-coller. Mais, après l'avoir enlevé, je voudrais être sûr de
comprendre son inutilité : est-ce bien parce que comme c'est une
fonction membre implémentée à l'intérieur de la classe elle est déjà
inline, ou y'a-t-il autre chose ?


Non, c'est ça. Inutile quand la fonction est définie dans la
classe.

7.1.2p2
A function defined within a class definition is an inline
function. The inline specifier shall not appear on a block
scope function declaration.

Est-ce que ça veut même dire que c'est illégal de le mettre ?


Non. La deuxième phrase parle des fonctions déclarées à la portée de
bloc. Donc, quelque chose comme :

void
f( std::istream& src )
{
inline std::Vector< int > v( std::istream_iterator< int >( src ),
std::istream_iterator< int >() ) ;
// ...
}

est illégal :-).

--
James Kanze GABI Software http://www.gabi-soft.fr
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



Avatar
kanze
"Aurélien REGAT-BARREL" wrote in
message news:<41246ff6$0$8965$...

Je crois, en fait, que boost::transform_iterator est exactement ce
qu'il cherche. Il suffit qu'il écrive un objet fonctionnel
ExtractNth, et le tour est joué.


Je commence doucement à utiliser boost. Je n'ai pas encore regardé
transform_iterator, j'y jetterai un oeil.


Par une coïncidence curieuse, j'ai eu prèsqu'exactement le même problème
à résoudre quelques heures après t'avoir répondu. Étant donné l'âge de
certains de mes compilateurs, Boost n'est pas une option, mais il m'a
fallu qu'environ une heure pour pondre le suivant :

template< typename C, typename T >
class FieldGetterCaller : public std::unary_function< C, T >
{
public:
explicit FieldGetterCaller( T (C::*getter)() const )
: get( getter )
{
}
T operator()( C const& obj ) const
{
return (obj.*get)() ;
}
private:
T (C::* get)() const ;
} ;

template< typename C, typename T >
inline FieldGetterCaller< C, T >
fieldGetter( T (C::*getter)() const )
{
return FieldGetterCaller< C, T >( getter ) ;
}

template< typename FwdIter, typename Filter >
class FilteringIterator
{
public:
explicit FilteringIterator( FwdIter iter )
: myIter( iter )
{
}
explicit FilteringIterator( FwdIter iter, Filter filter )
: myIter( iter )
, myFilter( filter )
{
}

typename Filter::result_type
operator*() const
{
return myFilter( *myIter ) ;
}

bool operator==( FilteringIterator const& other ) const
{
return myIter == other.myIter ;
}

bool operator!=( FilteringIterator const& other ) const
{
return myIter != other.myIter ;
}

FilteringIterator& operator++()
{
++ myIter ;
return *this ;
}

FilteringIterator operator++( int )
{
FilteringIterator result( *this ) ;
++ myIter ;
return result ;
}

private:
FwdIter myIter ;
Filter myFilter ;
} ;

template< typename FwdIter, typename Filter >
inline FilteringIterator< FwdIter, Filter >
filteringIter(
FwdIter iter,
Filter filter )
{
return FilteringIterator< FwdIter, Filter >( iter, filter ) ;
}

avec l'invocation :

size_t n = *std::max_element(
filteringIter( begin, fieldGetter( &Line::separatorPosition ) ),
filteringIter( end , fieldGetter( &Line::separatorPosition ) ) ) ;

Note bien que ce code ne fait que le minimum de ce qu'il fallait pour
résoudre mon problème. Dans un contexte plus général il faudrait soit
dériver de std::iterator, soit fournir soi-même les typedef nécessaire.
Apparamment, max_element ne s'en sert pas, et c'est pour l'instant la
seule fonction que j'appelle avec l'itérateur, mais d'autres fonctions
pourraient bien en avoir besoin. (Je crois d'ailleurs que je vais les
ajouter à mon code.)

--
James Kanze GABI Software http://www.gabi-soft.fr
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


Avatar
Michel Michaud
Dans news:,
"Michel Michaud" wrote in message
news:<%G8Wc.6738$...
7.1.2p2
A function defined within a class definition is an inline
function. The inline specifier shall not appear on a block
scope function declaration.

Est-ce que ça veut même dire que c'est illégal de le mettre ?


Non. La deuxième phrase parle des fonctions déclarées à la
portée de bloc. Donc, quelque chose comme :

void
f( std::istream& src )
{
inline std::Vector< int > v( std::istream_iterator< int
( src ),
std::istream_iterator< int >() ) ; // ...

}

est illégal :-).


Ah ok, je ne comprenais pas exactement « on a block scope function
declaration ». J'aurais écrit « on a function declaration at
block scope ». Et même là, une classe possède aussi un bloc :

class C
{
// c'est pas un bloc ici ?
};

Je ne trouve pas la définition de block scope dans la norme,
mais ça fait 25 heures que je n'ai pas dormi :-)

--
Michel Michaud
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/


Avatar
Gabriel Dos Reis
"Michel Michaud" writes:

| Dans news:,
| > "Michel Michaud" wrote in message
| > news:<%G8Wc.6738$...
| >> 7.1.2p2
| >> A function defined within a class definition is an inline
| >> function. The inline specifier shall not appear on a block
| >> scope function declaration.
| >
| >> Est-ce que ça veut même dire que c'est illégal de le mettre ?
| >
| > Non. La deuxième phrase parle des fonctions déclarées à la
| > portée de bloc. Donc, quelque chose comme :
| >
| > void
| > f( std::istream& src )
| > {
| > inline std::Vector< int > v( std::istream_iterator< int
| > >( src ),
| > std::istream_iterator< int >() ) ; // ...
| > }
| >
| > est illégal :-).
|
| Ah ok, je ne comprenais pas exactement « on a block scope function
| declaration ». J'aurais écrit « on a function declaration at
| block scope ». Et même là, une classe possède aussi un bloc :

et on l'appelle class-scope.

|
| class C
| {
| // c'est pas un bloc ici ?
| };
|
| Je ne trouve pas la définition de block scope dans la norme,

§6.3

-- Gaby
Avatar
Michel Michaud
Dans news:, Gabriel
"Michel Michaud" writes:
Je ne trouve pas la définition de block scope dans la norme,


§6.3


De l'index, on va à la page 26 (plus exactement 3.3.2 je dirais)
qui nous mène à 6.3 pour expliquer block et je n'y vois nulle
part l'expression block scope, mais on me renvoie à 3.3 en
parlant de local scope.

Dans 3.3.2 p1, je vois qu'on m'explique le « scope » d'un
« name declared in a block »... Ça me paraît être le « name
scope », pas le block scope.

Mais bon, j'en suis rendu à 34 heures sans sommeil alors disons
que j'ai compris ce que c'est, de toute façon !

--
Michel Michaud
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/


Avatar
Gabriel Dos Reis
"Michel Michaud" writes:

| Dans news:, Gabriel
| > "Michel Michaud" writes:
| >> Je ne trouve pas la définition de block scope dans la norme,
| >
| > §6.3
|
| De l'index, on va à la page 26 (plus exactement 3.3.2 je dirais)
| qui nous mène à 6.3 pour expliquer block et je n'y vois nulle
| part l'expression block scope, mais on me renvoie à 3.3 en
| parlant de local scope.
|
| Dans 3.3.2 p1, je vois qu'on m'explique le « scope » d'un
| « name declared in a block »... Ça me paraît être le « name
| scope », pas le block scope.

Hein ?

| Mais bon, j'en suis rendu à 34 heures sans sommeil alors disons
| que j'ai compris ce que c'est, de toute façon !

Peut-être parce que visiblement, excepté toi, personne ne sait ce que
tu cherches. Tu devrais peut-être dormir un coup ;-)

-- Gaby
Avatar
Michel Michaud
Dans news:, Gabriel
"Michel Michaud" writes:
Dans 3.3.2 p1, je vois qu'on m'explique le « scope » d'un
« name declared in a block »... Ça me paraît être le « name
scope », pas le block scope.


Hein ?


Ce paragraphe ne parle pas de block scope, c'est tout.

[...]
Peut-être parce que visiblement, excepté toi, personne ne sait
ce que tu cherches. Tu devrais peut-être dormir un coup ;-)


Je cherchais simplement à comprendre ce que signifiait
block scope tel qu'employé dans la norme. James m'a répondu...

Visiblement il ne s'agit pas d'un terme avec une définition
précise, noir sur blanc, dans la norme. End of transmission :-)

--
Michel Michaud
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/


1 2 3