J'ai un conteneur map definit comme ci :
std::map<const char *, int> mapAttribut;
Dans une boucle, j'ai ca:
Avant d'ajouter un élèment, je m'assure qu'il n'existe pas déjà. Je
déclare un iterateur comme ci :
std::map<const char *, int>::iterator it;
it = mapAttribut.find("toto");
if (it == mapAttribut.end())
//je ne l'ai pas trouvé
//alors je l'ajoute
mapAttribut["toto"] = 1;
else
//je l'ai trouvé
//je vérifie alors que la valeur est la même
if (mapAttribut["toto"] != 1)
return error;
Est ce que j'ai fait une erreur? Car sinon y a un bug.
Dès que je veux ajouter un élèment avec le chiffre 2, par exemple
mapAttribut["titi"] = 2, mapAttribut.find("titi") ne me renvoie pas
mapAttribut.end()! Il lui a même associé une valeur 1.
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
Gabriel Dos Reis
Pascal writes:
| Bonjour, | | J'ai un conteneur map definit comme ci : | std::map<const char *, int> mapAttribut; | | Dans une boucle, j'ai ca: | Avant d'ajouter un élèment, je m'assure qu'il n'existe pas déjà. Je | déclare un iterateur comme ci : | std::map<const char *, int>::iterator it; | | it = mapAttribut.find("toto"); | if (it == mapAttribut.end()) | //je ne l'ai pas trouvé | //alors je l'ajoute | mapAttribut["toto"] = 1; | else | //je l'ai trouvé | //je vérifie alors que la valeur est la même | if (mapAttribut["toto"] != 1) | return error; | | Est ce que j'ai fait une erreur?
Oui : une chaîne de caractères n'est pas un const char*.
Essaye avec
typedef std::map<std::string, int> map; typedef map::iterator iterator; map mapAttribut; std::pair<iterator, bool> result = mapAttribut.insert(map::value_type("toto", 1)); // l'existance d'une paire ("toto", n) avec n != 1 // est une erreur if (!result.second && result.first->second != 1) return error;
-- Gaby
Pascal <pascal@spam.org> writes:
| Bonjour,
|
| J'ai un conteneur map definit comme ci :
| std::map<const char *, int> mapAttribut;
|
| Dans une boucle, j'ai ca:
| Avant d'ajouter un élèment, je m'assure qu'il n'existe pas déjà. Je
| déclare un iterateur comme ci :
| std::map<const char *, int>::iterator it;
|
| it = mapAttribut.find("toto");
| if (it == mapAttribut.end())
| //je ne l'ai pas trouvé
| //alors je l'ajoute
| mapAttribut["toto"] = 1;
| else
| //je l'ai trouvé
| //je vérifie alors que la valeur est la même
| if (mapAttribut["toto"] != 1)
| return error;
|
| Est ce que j'ai fait une erreur?
Oui : une chaîne de caractères n'est pas un const char*.
Essaye avec
typedef std::map<std::string, int> map;
typedef map::iterator iterator;
map mapAttribut;
std::pair<iterator, bool> result =
mapAttribut.insert(map::value_type("toto", 1));
// l'existance d'une paire ("toto", n) avec n != 1
// est une erreur
if (!result.second && result.first->second != 1)
return error;
| Bonjour, | | J'ai un conteneur map definit comme ci : | std::map<const char *, int> mapAttribut; | | Dans une boucle, j'ai ca: | Avant d'ajouter un élèment, je m'assure qu'il n'existe pas déjà. Je | déclare un iterateur comme ci : | std::map<const char *, int>::iterator it; | | it = mapAttribut.find("toto"); | if (it == mapAttribut.end()) | //je ne l'ai pas trouvé | //alors je l'ajoute | mapAttribut["toto"] = 1; | else | //je l'ai trouvé | //je vérifie alors que la valeur est la même | if (mapAttribut["toto"] != 1) | return error; | | Est ce que j'ai fait une erreur?
Oui : une chaîne de caractères n'est pas un const char*.
Essaye avec
typedef std::map<std::string, int> map; typedef map::iterator iterator; map mapAttribut; std::pair<iterator, bool> result = mapAttribut.insert(map::value_type("toto", 1)); // l'existance d'une paire ("toto", n) avec n != 1 // est une erreur if (!result.second && result.first->second != 1) return error;
-- Gaby
kanze
Pascal wrote:
J'ai un conteneur map definit comme ci : std::map<const char *, int> mapAttribut;
C-à-d : tu te sers de l'adresse comme clé. C'est extrèmement rare que ce soit ce qu'on veut. La plupart du temps, la solution la plus simple, c'est d'utiliser des chaînes de caractères (std::string) à la place des pointeurs. Si pour une raisons quelconque, on veut réelement utiliser des char const*, disons parce qu'on tient à ce que les indices soient des constantes de chaîne, il faut ajouter une comparateur spécial à map, pourqu'il utilise stdcmp ou quelque chose de semblable dans la comparaison. (Mais je répète, c'est rarement ce qu'on veut.)
-- 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
Pascal wrote:
J'ai un conteneur map definit comme ci :
std::map<const char *, int> mapAttribut;
C-à-d : tu te sers de l'adresse comme clé. C'est extrèmement
rare que ce soit ce qu'on veut. La plupart du temps, la solution
la plus simple, c'est d'utiliser des chaînes de caractères
(std::string) à la place des pointeurs. Si pour une raisons
quelconque, on veut réelement utiliser des char const*, disons
parce qu'on tient à ce que les indices soient des constantes de
chaîne, il faut ajouter une comparateur spécial à map, pourqu'il
utilise stdcmp ou quelque chose de semblable dans la
comparaison. (Mais je répète, c'est rarement ce qu'on veut.)
--
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
J'ai un conteneur map definit comme ci : std::map<const char *, int> mapAttribut;
C-à-d : tu te sers de l'adresse comme clé. C'est extrèmement rare que ce soit ce qu'on veut. La plupart du temps, la solution la plus simple, c'est d'utiliser des chaînes de caractères (std::string) à la place des pointeurs. Si pour une raisons quelconque, on veut réelement utiliser des char const*, disons parce qu'on tient à ce que les indices soient des constantes de chaîne, il faut ajouter une comparateur spécial à map, pourqu'il utilise stdcmp ou quelque chose de semblable dans la comparaison. (Mais je répète, c'est rarement ce qu'on veut.)
-- 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
Pascal wrote:
Gabriel Dos Reis wrote:
Oui : une chaîne de caractères n'est pas un const char*.
Pourquoi?
Parce que std::map utilises == pour comparer 2 clés, et pas strcmp.
Arnaud
Pascal wrote:
Gabriel Dos Reis wrote:
Oui : une chaîne de caractères n'est pas un const char*.
Pourquoi?
Parce que std::map utilises == pour comparer 2 clés, et pas strcmp.
Oui : une chaîne de caractères n'est pas un const char*.
Pourquoi?
Parce que std::map utilises == pour comparer 2 clés, et pas strcmp.
Arnaud
Pascal
Gabriel Dos Reis wrote:
Oui : une chaîne de caractères n'est pas un const char*.
Pourquoi?
Essaye avec
typedef std::map<std::string, int> map; typedef map::iterator iterator; map mapAttribut; std::pair<iterator, bool> result = mapAttribut.insert(map::value_type("toto", 1)); // l'existance d'une paire ("toto", n) avec n != 1 // est une erreur if (!result.second && result.first->second != 1) return error;
-- Gaby
Mais je voudrais mettre soit 1 ou 2. -- Pascal
Gabriel Dos Reis wrote:
Oui : une chaîne de caractères n'est pas un const char*.
Pourquoi?
Essaye avec
typedef std::map<std::string, int> map;
typedef map::iterator iterator;
map mapAttribut;
std::pair<iterator, bool> result =
mapAttribut.insert(map::value_type("toto", 1));
// l'existance d'une paire ("toto", n) avec n != 1
// est une erreur
if (!result.second && result.first->second != 1)
return error;
Oui : une chaîne de caractères n'est pas un const char*.
Pourquoi?
Essaye avec
typedef std::map<std::string, int> map; typedef map::iterator iterator; map mapAttribut; std::pair<iterator, bool> result = mapAttribut.insert(map::value_type("toto", 1)); // l'existance d'une paire ("toto", n) avec n != 1 // est une erreur if (!result.second && result.first->second != 1) return error;
-- Gaby
Mais je voudrais mettre soit 1 ou 2. -- Pascal
Pascal
wrote:
C-à-d : tu te sers de l'adresse comme clé. C'est extrèmement rare que ce soit ce qu'on veut. La plupart du temps, la solution la plus simple, c'est d'utiliser des chaînes de caractères (std::string) à la place des pointeurs.
Ok merci. J'ai remplacé par string, et maintenant ça marche bien.
-- Pascal
kanze@gabi-soft.fr wrote:
C-à-d : tu te sers de l'adresse comme clé. C'est extrèmement
rare que ce soit ce qu'on veut. La plupart du temps, la solution
la plus simple, c'est d'utiliser des chaînes de caractères
(std::string) à la place des pointeurs.
Ok merci. J'ai remplacé par string, et maintenant ça marche bien.
C-à-d : tu te sers de l'adresse comme clé. C'est extrèmement rare que ce soit ce qu'on veut. La plupart du temps, la solution la plus simple, c'est d'utiliser des chaînes de caractères (std::string) à la place des pointeurs.
Ok merci. J'ai remplacé par string, et maintenant ça marche bien.