Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Bug dans la stl map?

5 réponses
Avatar
Pascal
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? 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.

Quelqu'un peut m'aider???

5 réponses

Avatar
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
Avatar
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

Avatar
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


Avatar
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

Avatar
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