J'aurais besoin d'une confirmation sur l'utilisation de for_each.
Le 3ème paramètre est une fonction objet, donc une fonction ordinaire peut
convenir (si j'ai bien compris la doc).
Exemple :
//-----------------------------------------
class Maclasse
{
int num;
... //données et fonctions membres de Maclasse
};
// qq part dans le code
vector<Maclasse> V;
for_each (V.begin(), V.end(), AfficheMaclasse);
//-------------------------------------------
J'ai essayé quelque chose comme ça, qui à l'air de tourner, mais je voudrais
être sûr qu'il n'y a pas d'erreur, que cette utilisation de for_each est
correcte (dans un cadre simple comme celui de cet exemple).
// qq part dans le code vector<Maclasse> V; for_each (V.begin(), V.end(), AfficheMaclasse);
//-------------------------------------------
J'ai essayé quelque chose comme ça, qui à l'air de tourner, mais je voudrais
être sûr qu'il n'y a pas d'erreur, que cette utilisation de for_each est correcte (dans un cadre simple comme celui de cet exemple).
Aucune raison que ça ne marche pas, en fait, si tu regardes la spec de for_each : template <class InputIterator, class Function> Function for_each (InputIterator first, InputIterator last, Function f)
le paramètre Function , type générique, peut très bien être de type pointeur sur fonction (c'est le type que tu as dans ton appel au-dessus). Je ne retrouve pas le code de for_each mais il doit ressembler à un truc comme ça :
template <class InputIterator, class Function> Function for_each (InputIterator first, InputIterator last, Function f) { InputIterator i = first; while( i != last) { f( *i ); ++i; } return f; }
f peut donc très bien être une vraie fonction, un pointeur de fonction, une classe avec un opérateur (), etc... du moment que le type du paramètre est celui "pointé" par l'itérateur.
Merci.
-- R. VOISIN De rien !
"Remi Voisin" <oulala-rvoisin@mail.dotcom.fr> a écrit dans le message de
news:vgfervg70v8udmn8h6pfedbjidb5gor438@4ax.com...
Bonjour
J'aurais besoin d'une confirmation sur l'utilisation de for_each.
Le 3ème paramètre est une fonction objet, donc une fonction ordinaire
peut
convenir (si j'ai bien compris la doc).
Oui, il n'y a pas de raison. En tout cas, je l'ai déjà fait comme ça.
Exemple :
//-----------------------------------------
class Maclasse
{
int num;
... //données et fonctions membres de Maclasse
};
// qq part dans le code
vector<Maclasse> V;
for_each (V.begin(), V.end(), AfficheMaclasse);
//-------------------------------------------
J'ai essayé quelque chose comme ça, qui à l'air de tourner, mais je
voudrais
être sûr qu'il n'y a pas d'erreur, que cette utilisation de for_each est
correcte (dans un cadre simple comme celui de cet exemple).
Aucune raison que ça ne marche pas, en fait, si tu regardes la spec de
for_each :
template <class InputIterator, class Function>
Function for_each (InputIterator first, InputIterator last, Function f)
le paramètre Function , type générique, peut très bien être de type pointeur
sur fonction (c'est le type que tu as dans ton appel au-dessus). Je ne
retrouve pas le code de for_each mais il doit ressembler à un truc comme ça
:
template <class InputIterator, class Function>
Function for_each (InputIterator first, InputIterator last, Function f)
{
InputIterator i = first;
while( i != last)
{
f( *i );
++i;
}
return f;
}
f peut donc très bien être une vraie fonction, un pointeur de fonction, une
classe avec un opérateur (), etc... du moment que le type du paramètre est
celui "pointé" par l'itérateur.
// qq part dans le code vector<Maclasse> V; for_each (V.begin(), V.end(), AfficheMaclasse);
//-------------------------------------------
J'ai essayé quelque chose comme ça, qui à l'air de tourner, mais je voudrais
être sûr qu'il n'y a pas d'erreur, que cette utilisation de for_each est correcte (dans un cadre simple comme celui de cet exemple).
Aucune raison que ça ne marche pas, en fait, si tu regardes la spec de for_each : template <class InputIterator, class Function> Function for_each (InputIterator first, InputIterator last, Function f)
le paramètre Function , type générique, peut très bien être de type pointeur sur fonction (c'est le type que tu as dans ton appel au-dessus). Je ne retrouve pas le code de for_each mais il doit ressembler à un truc comme ça :
template <class InputIterator, class Function> Function for_each (InputIterator first, InputIterator last, Function f) { InputIterator i = first; while( i != last) { f( *i ); ++i; } return f; }
f peut donc très bien être une vraie fonction, un pointeur de fonction, une classe avec un opérateur (), etc... du moment que le type du paramètre est celui "pointé" par l'itérateur.
// qq part dans le code vector<Maclasse> V; for_each (V.begin(), V.end(), AfficheMaclasse);
Petite parenthèse, pour l'affichage, std::copy est pas mal -> copy(V.begin(), V.end(), ostream_iterator<MaClasse>(cout,"n")); A condition que ici que l'opérateur << affiche le champs num.
-- Luc Hermitte <hermitte at free.fr> FAQ de <news:fr.comp.lang.c++> : <http://www.cmla.ens-cachan.fr/Utilisateurs/dosreis/C++/FAQ/> Dejanews : <http://groups.google.com/advanced_group_search>
Remi Voisin <oulala-rvoisin@mail.dotcom.fr> wrote in
news:vgfervg70v8udmn8h6pfedbjidb5gor438@4ax.com:
// qq part dans le code
vector<Maclasse> V;
for_each (V.begin(), V.end(), AfficheMaclasse);
Petite parenthèse, pour l'affichage, std::copy est pas mal
->
copy(V.begin(), V.end(), ostream_iterator<MaClasse>(cout,"n"));
A condition que ici que l'opérateur << affiche le champs num.
--
Luc Hermitte <hermitte at free.fr>
FAQ de <news:fr.comp.lang.c++> :
<http://www.cmla.ens-cachan.fr/Utilisateurs/dosreis/C++/FAQ/>
Dejanews : <http://groups.google.com/advanced_group_search>
// qq part dans le code vector<Maclasse> V; for_each (V.begin(), V.end(), AfficheMaclasse);
Petite parenthèse, pour l'affichage, std::copy est pas mal -> copy(V.begin(), V.end(), ostream_iterator<MaClasse>(cout,"n")); A condition que ici que l'opérateur << affiche le champs num.
-- Luc Hermitte <hermitte at free.fr> FAQ de <news:fr.comp.lang.c++> : <http://www.cmla.ens-cachan.fr/Utilisateurs/dosreis/C++/FAQ/> Dejanews : <http://groups.google.com/advanced_group_search>
Remi Voisin
Bonjour
Petite parenthèse, pour l'affichage, std::copy est pas mal copy(V.begin(), V.end(), ostream_iterator<MaClasse>(cout,"n")); A condition que ici que l'opérateur << affiche le champs num.
En fait ma fonction d'affichage est beaucoup plus complexe et la classe aussi, j'affiche dans une fenêtre Windows, pas sur cout. J'avais juste mis cela comme exemple simple. Merci néanmoins pour le conseil.
-- R. VOISIN
Bonjour
Petite parenthèse, pour l'affichage, std::copy est pas mal
copy(V.begin(), V.end(), ostream_iterator<MaClasse>(cout,"n"));
A condition que ici que l'opérateur << affiche le champs num.
En fait ma fonction d'affichage est beaucoup plus complexe et la classe
aussi, j'affiche dans une fenêtre Windows, pas sur cout. J'avais juste mis
cela comme exemple simple.
Merci néanmoins pour le conseil.
Petite parenthèse, pour l'affichage, std::copy est pas mal copy(V.begin(), V.end(), ostream_iterator<MaClasse>(cout,"n")); A condition que ici que l'opérateur << affiche le champs num.
En fait ma fonction d'affichage est beaucoup plus complexe et la classe aussi, j'affiche dans une fenêtre Windows, pas sur cout. J'avais juste mis cela comme exemple simple. Merci néanmoins pour le conseil.