OVH Cloud OVH Cloud

string et constructeur

23 réponses
Avatar
Nicolas Aunai
bonjour,


comment, dans la liste d'initialisation d'un constructeur, définir la
taille d'une variable string ?


existe-t-il un constructeur pour string qui prendrait la taille en
argument ? je n'en ai aps vu, de plus il semble que :

class A
{
public :
string s;
A();
}

A()
:s(5)
{

}

ne marche pas car le constructeur de string semble vouloir un char *.

j'ai une parade qui consiste a faire :

A()
:s(" ") //'taille' espace
{

}

mais ça sonne un peu "bidouille" a deux euros..

--
Nico,
http://astrosurf.com/nicoastro
messenger : nicolas_aunai@hotmail.com

10 réponses

1 2 3
Avatar
Michel Leunen
Nicolas Aunai wrote:

existe-t-il un constructeur pour string qui prendrait la taille en
argument ? je n'en ai aps vu, de plus il semble que :


Il y a le constructeur:
basic_string (size_type n, charT c, const Allocator& a = Allocator());
A()
:s(" ") //'taille' espace


ce qui te permet d'écrire:
A():s(5,' '){}
ou ce que tu veux commme caractère pour le second argument.

Michel
--
----------------------------------------
Michel Leunen
mailto:
http://www.leunen.com/cbuilder/
----------------------------------------

Avatar
Benoit Dejean
Le Sat, 29 Nov 2003 13:33:54 +0100, Michel Leunen a écrit :

ce qui te permet d'écrire:
A():s(5,' '){}
ou ce que tu veux commme caractère pour le second argument.


faut faire très attention à l'ordre des arguments, je me suis souvent
trompé. mon compilateur ne m'aidant pas à cause de des conversions
implicites, le résultat est catastrophique

Avatar
Michaël Monerau
Nicolas Aunai wrote:
comment, dans la liste d'initialisation d'un constructeur, définir la
taille d'une variable string ?


Pourquoi faire une telle chose ? L'intérêt de std::string (en
particulier) est justement de ne pas s'occuper de la taille du string et
de faire les opérations dessus, comme ça nous plaît. Ensuite, c'est lui
qui s'occupe de redimensionner tout ça en dynamique, lorsqu'il y en a
besoin...

--
Michaël Monerau

Avatar
Nicolas Aunai
Le 30/11/2003, "Michaël Monerau" a supposé :

Pourquoi faire une telle chose ? L'intérêt de std::string (en particulier)
est justement de ne pas s'occuper de la taille du string et de faire les
opérations dessus, comme ça nous plaît. Ensuite, c'est lui qui s'occupe de
redimensionner tout ça en dynamique, lorsqu'il y en a besoin...



parce que j'ai une fonction qui a besoin de sa taille :

for(int i=0; i<s.length(); i ++)
cin >> s[i];

--
Nico,
http://astrosurf.com/nicoastro
messenger :

Avatar
Jean-Marc Bourguet
Nicolas Aunai ç writes:

:s(" ") //'taille' espace


:s(5, ' ')

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Avatar
Michaël Monerau
Nicolas Aunai wrote:
Le 30/11/2003, "Michaël Monerau" a supposé :

Pourquoi faire une telle chose ? L'intérêt de std::string (en
particulier) est justement de ne pas s'occuper de la taille du
string et de faire les opérations dessus, comme ça nous plaît.
Ensuite, c'est lui qui s'occupe de redimensionner tout ça en
dynamique, lorsqu'il y en a besoin...




parce que j'ai une fonction qui a besoin de sa taille :

for(int i=0; i<s.length(); i ++) cin >> s[i];


Ouh là ! C'est pas comme ça qu'on doit faire pour extraire un string
d'un flux !

Tu fais tout simplement :

cin >> s;
et tout va bien, jusqu'au prochain espace ou 'enter'. Tu peux aussi
avoir toute une ligne avec les fonctions du style de getline, etc...
Regarde dans les archives du groupe, il y a déjà eu pas mal de threads à
ce sujet (cherche un post de James particulièrement, où il montrait
comment extraire un int d'un flux, c'est un peu le même principe).

voilou

--
Michaël Monerau


Avatar
Nicolas Aunai
"Michaël Monerau" a exposé le 30/11/2003 :


Ouh là ! C'est pas comme ça qu'on doit faire pour extraire un string
d'un flux !

Tu fais tout simplement :

cin >> s;
et tout va bien, jusqu'au prochain espace ou 'enter'. Tu peux aussi
avoir toute une ligne avec les fonctions du style de getline, etc...
Regarde dans les archives du groupe, il y a déjà eu pas mal de threads à
ce sujet (cherche un post de James particulièrement, où il montrait
comment extraire un int d'un flux, c'est un peu le même principe).

voilou



euh, excuse mais tu c'est pas pourquoi je fais comme ça :)

ça n'a rien a voir avec le c++ mais je vais expliquer ce que je veux
faire :

j'ai une combinaison de dés et je veux demander a l'utilisateur
lesquels relancer, pour celà je lui demdande de taper un X en face du
dés a garder, et un '.' en face de celui a relancer, ma chaine ainsi
obtenue est convertie en tableau de booléens, et ma fonction 'lancer()'
ne relancer que si tab[i] == true...

exemple :


5 4 3 1 1
. . . X X

converti en booléen : 1 1 1 0 0


le cin >> s[i]; me permet de ne pas avoir d'espace dans ma chaine, et
donc de garder les mêmes indices de tableaux en tableaux...

avec un cin >> s; ça me ferait ". . . X X" et non "...XX" ce qui me
ferai 4 cases en trop, qu'il faudrai éliminer... enfin cette idée me
semble plus compliquée....


qu'en penses-tu ?

--
Nico,
http://astrosurf.com/nicoastro
messenger :

Avatar
Michaël Monerau
Nicolas Aunai wrote:

"Michaël Monerau" a exposé le 30/11/2003 :

euh, excuse mais tu c'est pas pourquoi je fais comme ça :)


;-)

ça n'a rien a voir avec le c++ mais je vais expliquer ce que je veux
faire :

j'ai une combinaison de dés et je veux demander a l'utilisateur lesquels
relancer, pour celà je lui demdande de taper un X en face du dés a
garder, et un '.' en face de celui a relancer, ma chaine ainsi obtenue
est convertie en tableau de booléens, et ma fonction 'lancer()' ne
relancer que si tab[i] == true...

exemple :


5 4 3 1 1
. . . X X

converti en booléen : 1 1 1 0 0


le cin >> s[i]; me permet de ne pas avoir d'espace dans ma chaine, et
donc de garder les mêmes indices de tableaux en tableaux...

avec un cin >> s; ça me ferait ". . . X X" et non "...XX" ce qui me
ferai 4 cases en trop, qu'il faudrai éliminer... enfin cette idée me
semble plus compliquée....


qu'en penses-tu ?


J'en pense que tu devrais tout de même prendre la chaîne dans un
std::string. Puis tu fais une fonction qui supprime les espaces dans ta
chaîne après(tout simple, un s.find_first_of (' ') avec un
s.erase(...)). Je trouve ça plus propre ;)

Tu pourrais aussi faire fonctionner tout ça avec un std::transform et un
functor, ce qui serait très propre à mon goût :) Ca transformerait tout
seul la chaîne (avec ou sans les espaces, selon tes envies, moi je
ferais avec) en un vector<bool>, ou ce que tu veux d'autre. Si tu veux,
je peux te faire un petit exemple si tu ne connais pas encore ;-)

--
Michaël Monerau

Avatar
Nicolas Aunai
"Michaël Monerau" a présenté l'énoncé suivant :


J'en pense que tu devrais tout de même prendre la chaîne dans un
std::string. Puis tu fais une fonction qui supprime les espaces dans ta
chaîne après(tout simple, un s.find_first_of (' ') avec un
s.erase(...)). Je trouve ça plus propre ;)


ben je vois aussi que ça fait plus propre, le problème étant que tout
ça est pour un projet (de deug) et mon code utilise déjà des notions
tout a fait hors programme...

pour ce qui est du find_first_of() et erase() je ne connaissais pas, ça
semble envisageable.

Tu pourrais aussi faire fonctionner tout ça avec un std::transform et un
functor, ce qui serait très propre à mon goût :)


oula, std::transform et foncteurs je connais seulement de nom...

Ca transformerait tout
seul la chaîne (avec ou sans les espaces, selon tes envies, moi je
ferais avec) en un vector<bool>, ou ce que tu veux d'autre. Si tu veux,
je peux te faire un petit exemple si tu ne connais pas encore ;-)


bah je veux bien ouais c'est sympa, mais ça sera uniquement pour ma
culture perso je pense...

--
Nico,
http://astrosurf.com/nicoastro
messenger :

Avatar
Michaël Monerau
Nicolas Aunai wrote:

"Michaël Monerau" a présenté l'énoncé suivant :


J'en pense que tu devrais tout de même prendre la chaîne dans un
std::string. Puis tu fais une fonction qui supprime les espaces dans ta
chaîne après(tout simple, un s.find_first_of (' ') avec un
s.erase(...)). Je trouve ça plus propre ;)



ben je vois aussi que ça fait plus propre, le problème étant que tout ça
est pour un projet (de deug) et mon code utilise déjà des notions tout a
fait hors programme...


arg, en effet... On pourrait te reprocher d'avoir demandé à quelqu'un
d'autre de faire le projet :(

Ca transformerait tout
seul la chaîne (avec ou sans les espaces, selon tes envies, moi je
ferais avec) en un vector<bool>, ou ce que tu veux d'autre. Si tu veux,
je peux te faire un petit exemple si tu ne connais pas encore ;-)



bah je veux bien ouais c'est sympa, mais ça sera uniquement pour ma
culture perso je pense...


oki, voilà :

#include <algorithm>

class Extractor
{
public:
bool operator (char test)
{
if (test == '.') // un point => true
return true;

return false; // un croix ou autre chose => false
}
};

//....

// On prend un std::string avec les espaces en input
std::string sInput;

// voir pour cin.getline, je ne me souviens plus exactement
// les arguments...


// il faut enlever les espaces du string, parce que le functor
// retournera false s'il trouve un espace ! Ce qui fausserait les index

std::string::iterator itFound;
while ((itFound = sInput.find_first_of (' ')) != sInput.npos)
// un espace est trouvé, on le supprime
sInput.erase (itFound);

std::vector<bool> Result;
std::transform (sInput.begin(), sInput.end(),
std::back_inserter<vector<bool>(Result), BoolExtractor ());



Et voilà ! tu te retrouves à la fin avec le vector Result qui contient
la suite de bool que tu voulais au départ. En effet, std::transform
applique le functor à tous les éléments de la liste que tu lui donnes
(ici sInput.begin()->sInput.end()), et il met les résultats à la fin de
Result (grâce au back_inserter).

Donc, ça serait comme ça que je le ferais moi :) Mais après, tu as
malheureusement des contraintes... dommage :(

--
Michaël Monerau


1 2 3