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

1 2 3 4 5
Avatar
fred
La solution pouvait être aussi :


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

class CFmt
{
public :
string szFmt;
void GetStringFormat(const string a){ szFmt= a;};
void SplitFmt(){
ConvertCharToInt
Vect=std::for_each(szFmt.begin(),szFmt.end(),ConvertCharToInt());
vector<int> vRec;
vRec= Vect.getVector();
};
};
Avatar
Michel Decima
"fred" a écrit dans le message de
news:

Effectivement (mais le fait que for_each retourne son functor n'etait pas
naturel
pour moi).

Pour clore le debat:

std::vector<int> vFmt(szFmt.size());
std::transform(szFmt.begin(), szFmt.end(), vFmt.begin(),
std::ptr_fun(&std::atoi));
Avatar
Franck Branjonneau
"Michel Decima" écrivait:

std::vector<int> vFmt(szFmt.size());
std::transform(szFmt.begin(), szFmt.end(), vFmt.begin(),
std::ptr_fun(&std::atoi));


J'utiliserais plutôt un std::vector<>::reserve sur vFmt et un
std::back_inserter<>.

Mais surtout je n'utiliserais pas std::atoi :

#include <cstdlib>
int atoi(const char *nptr);

converts the initial portion of the string pointed to by nptr to int.

--
Franck Branjonneau

Avatar
Fabien LE LEZ
On Wed, 22 Feb 2006 15:07:15 +0100, "Michel Decima"
:

On est bien d'accord, quand il s'agit de la _notion_ de classe. Maintenant,
en ce qui concerne les mots cles class et struct...


Les deux servent à introduire une classe.

Avatar
kanze
Fabien LE LEZ wrote:
On 22 Feb 2006 04:11:29 -0800, "fred" :

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


void SplitFmt(){


ConvertCharToInt convertisseur;
std::for_each(szFmt.begin(),szFmt.end(),convertisseur);
le_tableau_qui_m_interesse= convertisseur.GetData();


Mais non. N'oublie pas qu'on a passé l'objet fonctionnel par
valeur.

le_tableau_qui_m_interesse
= std::for_each( szFmt.begin(), szFmt.end(),
ConvertCharToInt() ) ;

devrait marcher, mais je ne sais pas si c'est une bonne idée :
on copie des tableaux par valeur, et surtout, ça ne dit pas ce
que ça fait.

En fait, qu'est-ce qu'il veut faire : transformer des char en
int. Et comme par hazard, il y a une fonction dans algorithme
qui s'appelle transform...

--
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
kanze
Fabien LE LEZ wrote:
On Wed, 22 Feb 2006 14:47:59 +0100, "Michel Decima" :

C'est juste. Mais d'un autre coté, il n'y a pas de classe, vu
que "class" introduit une structure dont les membres et
l'héritage sont privés par défaut.


Pas vraiment. La notion de "structure" semble assez floue :
apparemment elle est utilisée dans la norme, mais ça ressemble
plus à un oubli qu'à une volonté de piquer ce mot au langage
C. La notion de classe, en revanche, est une notion
fondamentale en C++ et dans les autres langages OO.


Dans la norme, « structure » et « union » sont des types de
classes -- toutes les structures et toutes les unions sont des
classes, mais l'inverse n'est pas vrai.

Dans le cas d'union, la distinction a un sens ; une union se
distingue des autres classes d'une manière significative. Dans
le cas de structure, c'est plus discutable. N'empèche qu'on a
(§9/4) : "A structure is a class defined with the class-key
struct;" et "A union is a class defined with the class-key
union".

Note bien le mot « defined » dans les deux cas. Si j'écris :

class Toto ;
struct Titi ;
union Tata ;

je n'ai rien défini, et pour l'instant, on a trois classes, dont
on ne sait pas si elles sont des structures ou des unions. On
peut très bien faire par la suite :

union Toto { } ;
class Titi { } ;
struct Tata { } ;

--
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
kanze
wrote:
La différence entre une classe et une structure est l'endroit
où elles sont stockées ? je me trompe ?


Oui.

Pour commencer, le C++ a des types de classe. Il n'y a pas de
type « structure », ni, en fait, « union ». Dans les
déclarations, les trois mots clé ont strictement la même
signification.

On appelle « structure » une classe dont la définition utilise
le mot clé « struct ». La *seule* différence par rapport à une
classe définie par le mot clé « class », c'est que les
declarations qui précèdent la première spécification d'accès
sont publiques, et non privées. Cette différence vaut aussi dans
le cas d'union, mais une union comporte d'autres différences
(plus importantes) aussi.

--
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
kanze
Franck Branjonneau wrote:
"Michel Decima" écrivait:

il n'y a pas de classe, vu que "class" introduit une structure dont
les membres et l'héritage sont privés par défaut.

(désolé, j'ai pas pu m'empécher ;)


Moi non plus ;-)

template< class T > struct S {};
template< struct T > class S {};

--
Franck Branjonneau



Avatar
kanze
Franck Branjonneau wrote:
"Michel Decima" écrivait:

il n'y a pas de classe, vu que "class" introduit une
structure dont les membres et l'héritage sont privés par
défaut.

(désolé, j'ai pas pu m'empécher ;)


Moi non plus ;-)

template< class T > struct S {};
template< struct T > class S {};


Ici, le mot clé struct est illégal. Mais le mot clé class
n'introduit pas une classe non plus ; ce n'est ni une
définition, ni une déclaration.

--
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
Gabriel Dos Reis
"kanze" writes:

| wrote:
| > La différence entre une classe et une structure est l'endroit
| > où elles sont stockées ? je me trompe ?
|
| Oui.
|
| Pour commencer, le C++ a des types de classe. Il n'y a pas de
| type « structure », ni, en fait, « union ». Dans les
| déclarations, les trois mots clé ont strictement la même
| signification.

union U;
// ...
struct U { };
int main()
{
U u;
}

jk.C:3: error: 'struct' tag used in naming 'union U'

-- Gaby
1 2 3 4 5