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?
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
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
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)...
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
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
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));
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
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?
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;
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?
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.
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.
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.
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
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.
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
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
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
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
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
kanze@gabi-soft.fr 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
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