OVH Cloud OVH Cloud

STL for_each : paramètres

4 réponses
Avatar
Remi Voisin
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).

Exemple :
//-----------------------------------------
class Maclasse
{
int num;
... //données et fonctions membres de Maclasse
};

void AfficheMaclasse (const Maclasse& clas)
{ cout << clas.num << endl;
}

// 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).

Merci.

--
R. VOISIN

4 réponses

Avatar
Alexandre
"Remi Voisin" a écrit dans le message de
news:
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
};

void AfficheMaclasse (const Maclasse& clas)
{ cout << clas.num << endl;
}

// 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 !


Avatar
Remi Voisin
Bonjour

OK merci pour cette confirmation.

--
R. VOISIN
(Enlevez "oulala-" pour m'écrire.)
Avatar
Luc Hermitte
Remi Voisin wrote in
news::

void AfficheMaclasse (const Maclasse& clas)
{ cout << clas.num << endl;
}

// 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>

Avatar
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