Bonjour,
Tout d'abord, excusez moi pour le manque d'accent dans ce message, je suis a l'etranger sur un clavier qwerty.
Voila mon probleme. Je dispose d'une structure assez simple qui ne contient que deux champs : un entier et une string.
Je souhaite creer un set de mapping dont l'ordre est donne par le code comme specifie dans la surcharge de l'operateur <. Jusque la, tout va bien. Je remplis mon set avec des mappings dont le label est different et les elements sont bien ordonnes.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 struct mapping{ int code; string label; bool operator<(const mapping& map) const { return code < map.code; } bool operator==(const mapping& map) const { return label.compare(map.label) == 0 ; } };
Dans un deuxieme temps, je souhaite ajouter de nouveaux mappings mais cette fois ci je ne suis plus certains qu'un mapping avec le meme label n'existe pas deja dans le set. En fait, s'il existe, je souhaite mettre a jour son code et sinon, je souhaite ajouter un nouveau mapping. J'ai donc besoin que la fonction find(m) me retourne un pointeur vers un mapping ayant le meme label que m. C'est la que le probleme intervient. Malgre la surcharge de l'operateur ==, find semble se baser sur l'ordre etabli par l'operateur <. Voici un bout de code pour illustrer ce comportement.
L' output correspondant est:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 mapping m = {1,"xxx"}; mapping m2 ={1, "yyy"}; this->fn[0].insert(m); set<mapping>::iterator itTmp; itTmp = this->fn[0].find(m2); if (itTmp != this->fn[0].end() ) { cout << "m2 existe "<<endl; if ( !(*itTmp == m2) ){ cout << "Pourtant ils sont differents selon l'operateur == "<<endl; } }
Je pensais qu'en surchargeant les 2 operateurs (< necessaire pour les sets et == pour le find()) tout allait bien se passer malgre le fait qu'ils ne portent pas sur le meme attribut de la structure.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2m2 existe Pourtant ils sont differents selon l'operateur ==
Une idee de comment je peux m'en sortir? Dois je changer de conteneur? Je voudrais eviter la solution d'un iterateur sur tout le set avec comparaison systematique de l'attribut label car cette solution est en O(n) (n pouvant etre assez grand dans mon cas) et je prefererai donc une solution en O(log n) si possible.
Merci d'avance,
Yoann
Partager