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.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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 :
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
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 :
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 kanze.james@neuf.fr
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
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 :
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
Stephane Wirtel
Pourquoi ne pas faire une conversion en employer std::istringstream ?
Pourquoi ne pas faire une conversion en employer std::istringstream ?
Exactement ! Merci merci !! c'est vraiment passionnant d'explorer toutes ces possibilités !
Fred
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
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
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
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..
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 ???
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..
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.
In news:1140777277.728007.50980@p10g2000cwp.googlegroups.com,
fred <fm29@gmx.net> 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.
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.
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
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 kanze.james@neuf.fr
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
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
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
"fred" <fm29@gmx.net> é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.
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.