OVH Cloud OVH Cloud

[newbie] utiliser la stl

7 réponses
Avatar
Pascal
Bonjour,

Je débute la programmation en c++ sous linux. J'ai entendu parler de la
stl. J'ai besoin d'un tableau à deux dimension, qui contient sur la
première colonne des types char *, et sur la deuxième colonne des types
int (que des 1 ou 2).

ex : Soit le tableau suivant
machin | 1
bidule | 2
truc | 1

Admettons j'ai un couple (truc, 2). Or dans le tableau, truc a une
valeur de 1. Donc mon couple est faux. Il me faut donc une fonction qui
recherche dans ce tableau. J'ai aussi besoin de pouvoir insérer des
couples dans ce tableau. Quel classe de la stl me conseillez vous? Et
comment faire pour l'utiliser sous linux, car j'ai trouvé pas mal de
classe de la stl (comme vector, deque etc...) et les fonctions qui s'y
rapporte, mais comment faire pour les utiliser?

Cordialement,
--
Pascal

7 réponses

Avatar
noone
Pascal wrote:
Bonjour,

Je débute la programmation en c++ sous linux. J'ai entendu parler de la
stl. J'ai besoin d'un tableau à deux dimension, qui contient sur la
première colonne des types char *, et sur la deuxième colonne des types
int (que des 1 ou 2).

ex : Soit le tableau suivant
machin | 1
bidule | 2
truc | 1

Admettons j'ai un couple (truc, 2). Or dans le tableau, truc a une
valeur de 1. Donc mon couple est faux. Il me faut donc une fonction qui
recherche dans ce tableau. J'ai aussi besoin de pouvoir insérer des
couples dans ce tableau. Quel classe de la stl me conseillez vous? Et
comment faire pour l'utiliser sous linux, car j'ai trouvé pas mal de
classe de la stl (comme vector, deque etc...) et les fonctions qui s'y
rapporte, mais comment faire pour les utiliser?

Cordialement,


De débutant à débutant je te répond ;-)

Pourquoi ne pas faire une classe Ma_Classe_perso ?

cette classe contient des machin, bidule, truc : dans m_machin membre
machin (private)
cette classe contient des entiers : m_nombre (private)

Ensuite tu places tes objets de Ma_Classe_perso dans le conteneur STL
que tu veux (une "list", un "vector")

La fonction dont tu parles (qui a pour rôle de vérifier si truc est en
accord avec l'entier) peut être le constructeur de ta classe...

Mais si tu pouvait prendre des exemples plus parlant...

Donc première chose à faire créer ta classe pour contenir *un* élément
(machin | 1)...

Cordialement

Avatar
nmartin
Pascal wrote:
Bonjour,
bonjour


Je débute la programmation en c++ sous linux. J'ai entendu parler de la
stl. J'ai besoin d'un tableau à deux dimension, qui contient sur la
première colonne des types char *, et sur la deuxième colonne des types
int (que des 1 ou 2).

ex : Soit le tableau suivant
machin | 1
bidule | 2
truc | 1

Admettons j'ai un couple (truc, 2). Or dans le tableau, truc a une
valeur de 1. Donc mon couple est faux. Il me faut donc une fonction qui
recherche dans ce tableau. J'ai aussi besoin de pouvoir insérer des
couples dans ce tableau. Quel classe de la stl me conseillez vous?


map me semble bien adaptée.

typedef std::map<std::string, int> MaMap;

MaMap table;

pour la recherche, on aura :

typename MaMap::iterator it;
it = table.find("bidule");
if(it != table.end()){
// l'element existe
string clef = it->first;
int value = it->second;
}

pour l'insertion :
table.insert(MaMap::value_type("toto", 1));

nico

Avatar
Pascal
On Tue, 25 Jan 2005 12:29:13 +0100, nmartin wrote:

pour l'insertion :
table.insert(MaMap::value_type("toto", 1));



C'est aussi ce que j'ai utilisé. Mais pour l'insertion, je fais :
MaMap["toto"] = 1;

Quelle est la différence?

Avatar
nmartin
Pascal wrote:
On Tue, 25 Jan 2005 12:29:13 +0100, nmartin wrote:


pour l'insertion :
table.insert(MaMap::value_type("toto", 1));




C'est aussi ce que j'ai utilisé. Mais pour l'insertion, je fais :
MaMap["toto"] = 1;

Quelle est la différence?


pour l'insertion il n'y a pas de différence, par contre pour la
recherche il vaut mieux eviter l'operateur [] qui va creer une entree
dans la map avec une valeur pas defaut.


Avatar
Arnaud Debaene
Pascal wrote:
On Tue, 25 Jan 2005 12:29:13 +0100, nmartin wrote:

pour l'insertion :
table.insert(MaMap::value_type("toto", 1));



C'est aussi ce que j'ai utilisé. Mais pour l'insertion, je fais :
MaMap["toto"] = 1;

Quelle est la différence?


S'il y a déjà une entrée "toto" dans la map, ta version va l'écraser sans te
le dire alors que insert te permettra de savoir si tu as écrasé une valeur
existante ou pas.

Arnaud


Avatar
kanze
Arnaud Debaene wrote:
Pascal wrote:
On Tue, 25 Jan 2005 12:29:13 +0100, nmartin wrote:

pour l'insertion :
table.insert(MaMap::value_type("toto", 1));


C'est aussi ce que j'ai utilisé. Mais pour l'insertion, je fais :
MaMap["toto"] = 1;

Quelle est la différence?


S'il y a déjà une entrée "toto" dans la map, ta version va
l'écraser sans te le dire alors que insert te permettra de
savoir si tu as écrasé une valeur existante ou pas.


Correction : insert n'écrase jamais. S'il y a déjà un élément
avec la clé donnée, insert le laisse, sans le modifier. (Une
autre différence, c'est que insert fonctionne même si le type de
l'objet n'a pas de constructeur par défaut.)

--
James Kanze GABI Software http://www.gabi-soft.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



Avatar
kanze
wrote:
Arnaud Debaene wrote:
Pascal wrote:
On Tue, 25 Jan 2005 12:29:13 +0100, nmartin wrote:

pour l'insertion :
table.insert(MaMap::value_type("toto", 1));


C'est aussi ce que j'ai utilisé. Mais pour l'insertion, je fais
:



MaMap["toto"] = 1;

Quelle est la différence?


S'il y a déjà une entrée "toto" dans la map, ta version va
l'écraser sans te le dire alors que insert te permettra de
savoir si tu as écrasé une valeur existante ou pas.


Correction : insert n'écrase jamais. S'il y a déjà un élément
avec la clé donnée, insert le laisse, sans le modifier. (Une
autre différence, c'est que insert fonctionne même si le type
de l'objet n'a pas de constructeur par défaut.)


Une autre différence, peut-être même plus importante, me vient à
l'esprit : le comportament vis-à-vis des exceptions.
L'expression « MaMap[ "toto" ] = quelqueChose » finit par un
appel à un opérateur d'affectation, avec l'insertion achevée. Si
cette affectation lève une exception, l'élément aura bien été
créé dans le map, mais avec comme valeur la valeur par défaut.
Je ne sais pas exactement ce que la norme garantit en cas
d'insert, mais ça serait une très mauvaise implémentation qui ne
donnait pas la garantie forte, c-à-d que si on sort d'insert par
une exception, l'état du map est inchangé par rapport à avant
l'appel d'insert.

Donc, si on a un map<string,string>, et on fait :
maMap[ "toto" ] = "titi" ;
s'il y a une exception lors de l'affectation (disons un
bad_alloc), le map contiendra une entrée ("toto",""). Si on fait
avec insert, en cas d'exception, n'importe où dans l'expression,
il n'aura pas d'entrée "toto" dans le map.

--
James Kanze GABI Software http://www.gabi-soft.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