OVH Cloud OVH Cloud

STL - for_each et Objet fonction

58 réponses
Avatar
fred
Bonjour,

l'id=E9e est assez simple. Comment puis je r=E9cup=E9rer une
variable/instance de type vector apr=E8s l'appel l'algorithm for_each.
Comme dans l'exemple. Je parcours une string. pour chaque car.
convertit en entier que je place dans un vector<int>.
Mais apr=E8s l'appel =E0 for_each comme puis je acc=E9der au vector ?

merci d'avance

Fr=E9d=E9ric

class ConvertCharToInt
{
vector<int> vFmt;
public:
void operator() (char c)
{
vFmt.push_back(atoi(c));
}
};

class CFmt
{
public :
string szFmt;
void GetStringFormat(const string a){ szFmt=3D a;};
void SplitFmt(){
std::for_each(szFmt.begin(),szFmt.end(),ConvertCharToInt());
};
};
main()
{
CFmt *obj;
obj=3D new CFmt;
obj->GetStringFormat("123456");
obj->SplitFmt();
delete obj;
}

10 réponses

2 3 4 5 6
Avatar
Gabriel Dos Reis
Franck Branjonneau writes:

| Gabriel Dos Reis écrivait:
|
| > Franck Branjonneau writes:
| >
| > | "kanze" écrivait:
| > |
| > | > Un getter ne permet pas d'habitude une modification de l'objet.
| > | > Il renverra donc soit une copie, soit une référence à const. (De
| > | > même, il serait const lui-même.)
| > |
| > | L'anglais est une langue pauvre ;-) En français tu as accesseur en
| > | lecture (seule) ; accesseur en écriture (seule) et accesseur en
| > | lecture/écriture. Comment tu appelles le dernier en anglais ?
| >
| > read
| > write
| > readwrite
| > ?
|
| Non, nous parlions de getter/setter.

Je sais de quoi il était question à l'origine.

Maintenant, relis bien ton précédent message. Take a deep breath. Et
relis mon message.

-- Gaby
Avatar
Franck Branjonneau
Gabriel Dos Reis écrivait:

Franck Branjonneau writes:

| Gabriel Dos Reis écrivait:
|
| > Franck Branjonneau writes:
| >
| > | "kanze" écrivait:
| > |
| > | > Un getter ne permet pas d'habitude une modification de l'objet.
| > | > Il renverra donc soit une copie, soit une référence à const. (De
| > | > même, il serait const lui-même.)
| > |
| > | L'anglais est une langue pauvre ;-) En français tu as accesseur en
| > | lecture (seule) ; accesseur en écriture (seule) et accesseur en
| > | lecture/écriture. Comment tu appelles le dernier en anglais ?
| >
| > read
| > write
| > readwrite
| > ?
|
| Non, nous parlions de getter/setter.

Je sais de quoi il était question à l'origine.

Maintenant, relis bien ton précédent message. Take a deep breath. Et
relis mon message.


Getter peur se traduire par accesseur.

Parler de getter non const a alors un sens.

--
Franck Branjonneau

Avatar
Gabriel Dos Reis
Franck Branjonneau writes:

| Gabriel Dos Reis écrivait:
|
| > Franck Branjonneau writes:
| >
| > | Gabriel Dos Reis écrivait:
| > |
| > | > Franck Branjonneau writes:
| > | >
| > | > | "kanze" écrivait:
| > | > |
| > | > | > Un getter ne permet pas d'habitude une modification de l'objet.
| > | > | > Il renverra donc soit une copie, soit une référence à const. (De
| > | > | > même, il serait const lui-même.)
| > | > |
| > | > | L'anglais est une langue pauvre ;-) En français tu as accesseur en
| > | > | lecture (seule) ; accesseur en écriture (seule) et accesseur en
| > | > | lecture/écriture. Comment tu appelles le dernier en anglais ?
| > | >
| > | > read
| > | > write
| > | > readwrite
| > | > ?
| > |
| > | Non, nous parlions de getter/setter.
| >
| > Je sais de quoi il était question à l'origine.
| >
| > Maintenant, relis bien ton précédent message. Take a deep breath. Et
| > relis mon message.
|
| Getter peur se traduire par accesseur.

accesseur en lecture seule ? Très certainement.

| Parler de getter non const a alors un sens.

Probablement-être, mais mon message répondait spécifiquement au
paragraphe cité.

-- Gaby
Avatar
Alexandre
struct ConvertCharToInt
{
vector<int>* vFmt;
ConvertCharToInt(vector<int>& v) : vFmt(&v) {}
void operator()(char c) const
{ vFmt->push_back(atoi(c)); }
};


pourquoi pas
struct ConvertCharToInt
{
vector<int>& vFmt;
ConvertCharToInt(vector<int>& v):vFmt(v){}
....
}

plus simple qu'un pointeur AMA.

Avatar
Michel Decima
"Alexandre" a écrit dans le message de
news:4404d0f4$0$6433$
struct ConvertCharToInt
{
vector<int>* vFmt;
ConvertCharToInt(vector<int>& v) : vFmt(&v) {}
};


pourquoi pas
struct ConvertCharToInt
{
vector<int>& vFmt;
ConvertCharToInt(vector<int>& v):vFmt(v){}
....
}

plus simple qu'un pointeur AMA.


Avec une référence, tu ne peux plus utiliser l'operateur d'affectation par
defaut,
et donc sans code supplementaire le functor n'est plus Assignable (et je ne
sais
pas si c'est toujours un pré-requis pour le parametre de for_each, ca
l'etait
néanmoins dans la STL version SGI).


Avatar
kanze
Michel Decima wrote:
"Alexandre" a écrit dans le message de
news:4404d0f4$0$6433$
struct ConvertCharToInt
{
vector<int>* vFmt;
ConvertCharToInt(vector<int>& v) : vFmt(&v) {}
};


pourquoi pas
struct ConvertCharToInt
{
vector<int>& vFmt;
ConvertCharToInt(vector<int>& v):vFmt(v){}
....
}

plus simple qu'un pointeur AMA.


Avec une référence, tu ne peux plus utiliser l'operateur
d'affectation par defaut, et donc sans code supplementaire le
functor n'est plus Assignable (et je ne sais pas si c'est
toujours un pré-requis pour le parametre de for_each, ca
l'etait néanmoins dans la STL version SGI).


C'en est un. Même si c'est probable que ça marche quand même
avec beaucoup d'implémentations.

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



Avatar
Michel Decima
In news:,
kanze typed:

Avec une référence, tu ne peux plus utiliser l'operateur
d'affectation par defaut, et donc sans code supplementaire le
functor n'est plus Assignable (et je ne sais pas si c'est
toujours un pré-requis pour le parametre de for_each, ca
l'etait néanmoins dans la STL version SGI).


C'en est un. Même si c'est probable que ça marche quand même
avec beaucoup d'implémentations.


Merci pour la verification. Et effectivement, ca marche quand meme
avec xlC-6 et GCC-4 (pour ce dernier, je constate que le concept
Assignable n'est pas testé dans le code de for_each)


Avatar
kanze
Michel Decima wrote:
In news:,
kanze typed:

Avec une référence, tu ne peux plus utiliser l'operateur
d'affectation par defaut, et donc sans code supplementaire
le functor n'est plus Assignable (et je ne sais pas si
c'est toujours un pré-requis pour le parametre de for_each,
ca l'etait néanmoins dans la STL version SGI).


C'en est un. Même si c'est probable que ça marche quand même
avec beaucoup d'implémentations.


Merci pour la verification. Et effectivement, ca marche quand
meme avec xlC-6 et GCC-4 (pour ce dernier, je constate que le
concept Assignable n'est pas testé dans le code de for_each)


Alors, peut-être il n'en est pas un. Je n'arrive pas à trouver
des pré-requis pour for_each où que ce soit ; je suppose qu'il
doit être Copiable, parce qu'on le passe par copie, mais c'est
tout. Dans le paragraphe « Effects », il dit « Applies f to the
result of dereferencing the iterator ». Sans dire ce qu'il
entend par « applies » ; je suppose cependant que ce qu'on veut,
c'est que l'expression f(*iter) soit légale. Mais effectivement,
je ne vois pas d'exigeance pour Assignable.

Ni pour les prédicats, d'ailleurs. Dans tous les cas, je déduis
Copiable parce qu'ils sont passés par copie -- la norme n'en dit
rien explicitement. (Mais il y a beaucoup de choses que ma
copie de la norme -- C++98 quand même -- ni dit pas. Mais que le
bon sens nous dit : l'objet fonctionnel dans for_each ne doit
pas invalider les itérateurs, par exemple.)

Alors, j'ai toujours supposé que Assignable allait de pair avec
CopyConstructable. Mais à régarder de plus près...
CopyConstructible fait partie des pré-requis généraux, décris
dans §20.1. Assignable est décrit dans §23.1 ; est-ce qu'on doit
conclure qu'il ne s'applique que dans cette section, pour les
éléments d'une collection ? Je rémarque aussi que les output
iterators doivent être Assignable, mais les input iterators, pas
forcément. Chose qui m'étonne, parce que j'aurais crû que les
input interators et les output iterators suivaient la même règle
ici (et c'est un concepte assez lache d'Assignable).

En fin de compte, je me rends compte que je ne sais pas quels
sont les pré-requis pour Function dans for_each. Je dirais même
qu'a priori, il n'y en a pas ; il n'y a que des restrictions
déduites par le bon sens (Copiable, Callable avec un
std::iterator_traits< Iter >::reference, n'invalide pas les
itérateurs utilisés par for_each lui-même.)

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



Avatar
Michel Decima
In news:,
kanze typed:
Michel Decima wrote:
In news:,
kanze typed:


En fin de compte, je me rends compte que je ne sais pas quels
sont les pré-requis pour Function dans for_each. Je dirais même
qu'a priori, il n'y en a pas ; il n'y a que des restrictions
déduites par le bon sens (Copiable, Callable avec un
std::iterator_traits< Iter >::reference, n'invalide pas les
itérateurs utilisés par for_each lui-même.)


La doc SGI ne dit pas explicitement que le Function de for_each doit etre
Assignable,
en revanche elle dit qu'il doit etre un modele de UnaryFunction, lequel est
un raffinement
de Assignable (qui regroupe constructeur de copie, operator=, et swap).
C'est peut etre
un peu excessif comme exigences dans le cas de for_each, mais c'est
comprehensible
si on considere les predicats des containers, qui doivent forcement etre
Assignable.

Une question sans rapport avec for_each: j'ai eu besoin hier de l'equivalent
de copy_n,
qui est present chez SGI mais pas dans la norme (chez GCC, c'est une
extension).
Est ce qu'il y a une raison qui explique pourquoi copy_n n'a pas été repris
dans la norme,
alors que fill_n l'a été par exemple ?

MD.


Avatar
Gabriel Dos Reis
"Michel Decima" writes:

[...]

| Une question sans rapport avec for_each: j'ai eu besoin hier de l'equivalent
| de copy_n,
| qui est present chez SGI mais pas dans la norme (chez GCC, c'est une
| extension).
| Est ce qu'il y a une raison qui explique pourquoi copy_n n'a pas été repris
| dans la norme,
| alors que fill_n l'a été par exemple ?

Lorsque la STL a été présentée au comité (circa Janvier 1994),
celui-ci l'a trouvée très excitante mais aussi assez large (et donc
certains émettaient des réserves). Il a donc fallu qu'un volontaire
designé coupe quelque chose comme les 2/3 et le tri n'a pas toujours
été cohérent ou systématique. Alex confessera plus tard que cela lui
a brisé le coeur...

-- Gaby
2 3 4 5 6