[C++]Utilisation du find avec une map

mbenmoussa Messages postés 4 Date d'inscription   Statut Membre Dernière intervention   -  
mamiemando Messages postés 33778 Date d'inscription   Statut Modérateur Dernière intervention   -
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 33778 Date d'inscription   Statut Modérateur Dernière intervention   7 884
 
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   Statut Membre Dernière intervention   1
 
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 33778 Date d'inscription   Statut Modérateur Dernière intervention   7 884
 
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