[C++]Utilisation du find avec une map

Fermé
mbenmoussa Messages postés 4 Date d'inscription mercredi 29 mars 2006 Statut Membre Dernière intervention 1 septembre 2006 - 4 avril 2006 à 12:12
mamiemando Messages postés 33636 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 18 avril 2025 - 5 avril 2006 à 00:09
Bonjour,
j'utilise une map un peu complexe, qui a comme clé une classe :
map<C_Key, C_Data> myMap; // C_Key et C_Data sont 2 classes différentes
Le but est d'insérer dans ma map des objets de type <C_Key, C_Data>. Seulement, il faut que je vérifie si l'objet n'existe pas, auquel cas je fais un update de l'objet.
En utlisant la fonction find, la clé n'est jamais retrouvée, alors que j'ai plein de doublons. J'ai défini les différents opérateurs pouvant être utilisés par le find (le code étant dans le source) à l'intérieur de la classe C_Key:
int operator < (const C_Key &otherKey) const;
int operator > (const C_Key &otherKey) const;
int operator != (const C_Key &otherKey) const;
int operator == (const C_Key &otherKey) const;

Voici le code que j'utilise pour le find :
map<C_Key, C_Data*>::iterator iter;
iter = myMap.find(ident_map); // ident_map étant de type C_Key
if (iter != myMap.end())
{
...
}

On ne rentre jamais dans la boucle du "if". Quelqu'un peut-il m'aider svp? Merci d'avance.
A voir également:

3 réponses

mamiemando Messages postés 33636 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 18 avril 2025 7 842
4 avril 2006 à 12:34
Dans une map seule la clé est propre à chaque élément de la map. Cela signifie que tu peux avoir dans une map (k1,d1) (k2,d2) vu que k1!=k2.
Pour l'insertion tu peux utiliser directement l'opérateur [] :
my_map[k1]=d1;

Pour rechercher un élément :
std::map<std::string,int> my_map;
my_map["janvier"]=1;
my_map["fevrier"]=2;
//...
std::map<std::string,int>::const_iterator
  mit(my_map.find("fevrier")),
  mend(my_map.end());
if(mit!=mend){
  std::cout << "trouvé ! "<< mit->first << " "<< mit->second << std::endl;
}else{
  std::cout << "pas trouvé !";
}
std::cout << std::endl;

Bonne chance
6
mbenmoussa Messages postés 4 Date d'inscription mercredi 29 mars 2006 Statut Membre Dernière intervention 1 septembre 2006 1
4 avril 2006 à 13:55
Merci pour ta réponse. Le problème est toujours le même, il n'arrive pas à trouver l'élément, d'autant plus que la méthode de comparaison du find s'appuie sur des opérateurs pré-définis. Dans ton exemple, le find utilise la méthode de comparaison des string. Dans mon cas, je compare des objets d'une classe quelconque, et c'est pour ça que j'ai dû lui définir l'opérateur <, car sinon il n'acceptait pas la map.
Je pense que t'as dû te dire que je comparais les 2 éléments, au fait je compare bien les clés des 2 éléments à insérer (ident_map est de type C_Key).
1
mamiemando Messages postés 33636 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 18 avril 2025 7 842
5 avril 2006 à 00:09
Par défaut une map utilisera en fait l'opérateur less qui est défini pour les string entre autres (ordre alphabétique). Si ta clé est "un type de base" tu n'as a priori pas besoin de le redéfinir. Dans ton cas il faut redéfinir un operateur, mais j'aurais plutôt utilisé un foncteur que < :

http://c.developpez.com/faq/cpp/?page=STL#STL_functor
https://community.hpe.com/t5/custom/page/page-id/HPPSocialUserSignonPage?redirectreason=permissiondenied&referer=https%3A%2F%2Fcommunity.hpe.com%2Ft5%2FServers-Systems-The-Right%2FSGI-com-Tech-Archive-Resources-now-retired%2Fba-p%2F6992583

Malheureusement il me faut le morceau de ton code en question pour que je vois d'où vient le problème...

Bonne chance
1