Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Convertir une string en integer avec transform

9 réponses
Avatar
fred
Bonsoir,

Nouvel essai pour apprendre les algo. en Stl .Je voudrai =E0 l'aide de
l'alg. transform, convertir une chaine string dans un vector <int>
Transform, recoit en param=E8tres, le bornes begin et end, puis la
variable r=E9sultat et la fonction qui effectue un traitement. j'arrive
pas ,,,,


class ConvertCar
{
public :
int operator()(char c)
{
return atoi(c);
}
};

int main()
{
vector<int> vect;
string toto("1223456");
transform(toto.begin(), toto.end(),vect.begin(),ConvertCar());

return 0;
}

En fait je vois pas comment passer un vecteur a "transfom" pour y
mettre le resultat.

merci de votre aide.

9 réponses

Avatar
James Kanze
fred wrote:

Nouvel essai pour apprendre les algo. en Stl .Je voudrai à
l'aide de l'alg. transform, convertir une chaine string dans
un vector <int> Transform, recoit en paramètres, le bornes
begin et end, puis la variable résultat


Qui est elle aussi un itérateur. Seulement, dans ce cas-ci, sans
vérification des bornes -- c'est à toi de s'assurer que la
destination est assez gros.

et la fonction qui effectue un traitement. j'arrive pas ,,,,


class ConvertCar
{
public :
int operator()(char c)
{
return atoi(c);


Si ça compile, il y a un problème déjà. Régarde bien les
paramètres de atoi, et ce que tu lui donnes.

}
};


int main()
{
vector<int> vect;
string toto("1223456");
transform(toto.begin(), toto.end(),vect.begin(),ConvertCar());


Et combien d'entrées est-ce qu'il y a dans vect ? C'est un
vector de taille zéro, pour l'instant. Ce qui veut dire qu'il a
de la place pour zéro résultats. Ce qui risque de ne pas
suffire.

On peut forcer le vecteur à la taille voulue avant, au moyen de
resize(), mais l'idiome consacré dans ce cas-ci, c'est
d'utiliser un itérateur d'insertion :

transform( toto.begin(), toto.end(),
std::back_inserter( vect ),
ConvertCar() ) ;

Grosso modo, std::back_inserter renvoie un
std::back_insertion_iterator, qui est un itérateur dont le ++ ne
fait pour ainsi dire rien, mais dont l'affectation à
l'expression *iter appelle push_back sur la collection.

return 0;
}


En fait je vois pas comment passer un vecteur a "transfom"
pour y mettre le resultat.


Si le vecteur est assez grand, begin() fait l'affaire. Sinon, un
appel à back_inserter te donnera quelque chose qui l'agrandit
automatiquement.

En revanche, je crois que tu as encore à travailler ton
opérateur de conversion.

--
James Kanze
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
Stephane Wirtel
Pourquoi ne pas faire une conversion en employer std::istringstream ?
Avatar
Fabien LE LEZ
On Thu, 23 Feb 2006 22:14:13 +0100, Stephane Wirtel
:

Pourquoi ne pas faire une conversion en employer std::istringstream ?


Parce que le but n'est pas de produire une fonction, mais d'apprendre
à utiliser les algorithmes (transform en l'occurence).

Avatar
fred
Exactement ! Merci merci !!
c'est vraiment passionnant d'explorer toutes ces possibilités !

Fred
Avatar
kanze
Stephane Wirtel wrote:

Pourquoi ne pas faire une conversion en employer
std::istringstream ?


C-à-d quelque chose du genre :

struct ConvertCar
{
int operator()( char c ) const
{
std::istringstream s( std::string( 1, c ) ) ;
int result ;
s >> result ;
return result ;
}
} ;

Ça marchera. C'est même la solution canonique pour convertir
n'importe quoi en chaîne de caractère. Pour convertir un seul
caractère, en revanche, c'est peut-être un peu lourd. (J'avoue
que pour convertir un seul caractère, je me contenterais de
« return c - '0' ; ». Mais ben, j'aime la simplicité.)

--
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
fred
Allez la.. je pousse un peu :)

Encore une petite question... est il possible dans l'algo. transform,
de faire en sorte que l'appel à back_inserter sera effectué seulement
lorsque la valeur du atoi((char*)c) est différente de 0 ???

merci..
Avatar
Michel Decima
In news:,
fred typed:
Allez la.. je pousse un peu :)

Encore une petite question... est il possible dans l'algo. transform,
de faire en sorte que l'appel à back_inserter sera effectué seulement
lorsque la valeur du atoi((char*)c) est différente de 0 ???


Non. Pour faire cela, il faut utiliser remove_if apres transform.

Avatar
James Kanze
fred wrote:
Allez la.. je pousse un peu :)


Encore une petite question... est il possible dans l'algo.
transform, de faire en sorte que l'appel à back_inserter sera
effectué seulement lorsque la valeur du atoi((char*)c) est
différente de 0 ???


Non. C'est une très grande limitation à std::transform, qui dans
la pratique fait qu'on ne s'en sert que rarement : il faut que
la transformation soit un à un. Dans la pratique, c'est rarement
le cas, au moins dans les domaines où je travaille.

Cette restriction pourrait être enlevée partiellement avec un
itérateur filtrant, comme propose Boost. Mais seulement
partiellement. Je vois mal comment utiliser std::transform, ou
n'importe quel autre algorithme standard, pour des tâches aussi
fondamentales que la conversion UTF-8 en UTF-32 ou vice versa.

--
James Kanze
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
Franck Branjonneau
"fred" écrivait:

Encore une petite question... est il possible dans l'algo. transform,
de faire en sorte que l'appel à back_inserter sera effectué seulement
lorsque la valeur du atoi((char*)c) est différente de 0 ???


Avant de résoudre les problèmes d'<algorithm>, je me pencherais sur
l'utilisation de atoi.

--
Franck Branjonneau