std::map associer des index et une classe, comparison function - C++ - Programmation
Marsh Posté le 20-10-2008 à 23:00:03
J'ai fini par trouver : la bonne solution est bien de comparer seulement les longueurs... seulement, j'etais persuade de ne rechercher _que_ des entrees existatnes, et ce n'etait pas le cas. J'enregistre en effet les longueurs sous forme signee, et les recherchaient de facon absolues. Bref, mea culpa.
Marsh Posté le 31-10-2008 à 15:50:37
Mais non en fait ca marche pas... (je sais ca fait plusieurs jours, j'ai plein de trucs a faire )
Voici un exemple simple : une classe qui contient deux entiers (mettons que ce sont des positions, x/y)
Code :
|
Ensuite on construit une map qui fait la correspondance entre une position et un index unique (j'ai verifie, ils sont bien parfaitement uniques)
Je vous fourni (pour fins de tests si vous le desirez) les fonctions necessaires :
Code :
|
Ensuite, essayons avec la map de faire des recherches dedans : et bien vous trouverez des resultats qui vont correspondere a ce genre la :
#Adresses pos_x pos_y
13837 108 96
13837 96 108
Lors d'un appel a la hash table, par exemple : m_positionToAddr.find(CPoint2D(pos_x1,pos_y1))->second
Pour recuperer l'adresse correspondante a la position pos_x1, pos_y1 : la hash table renvoie tantot l'element x1, y1 et tanto y1,x1 a la meme adresse !!
Pourtant les adresses sont bien uniques, on peut le verifier avec ca :
Code :
|
L'output de cette fonction est rien... aucun doublon n'est trouve. Donc ma hash table est correcte, c'est mon operateur < de la classe CPoint2d qui ne fonctionne pas... mais je comprend rien
Si vous avez un peu de temps a consacrer a mon probleme.... merci milles fois !
Marsh Posté le 31-10-2008 à 23:43:29
Normal. La clé de ta map est un CPoint2D, pas ta valeur 13837.
Si on prends les points suivants : CPoint2D p1( 108, 96 ) et CPoint2D p2( 96, 108 ), ces 2 points sont différents d'après ton operateur!=
Du coup p1 et p2 peuvent avoir la même "adresse".
Marsh Posté le 03-11-2008 à 18:51:50
Riot a écrit : Normal. La clé de ta map est un CPoint2D, pas ta valeur 13837. |
?? Excuse moi je comprend pas : si ils sont differents ils peuvent avoir la meme adresse ?? Adresse dans la map, ou selon mon calcul d'adresse ?
Rhaa c'est stupide parce que mon calcul d'adresse calc_addr renvoi bien une adresse differente pour x/y inverses grace aux parametres x_wf,y_wf,x_ret,y_ret
Mais la map ne tiens pas compte de cela a cause de l'operateur != de CPoint2D ?
Si c'est le cas, je sais pas trop quelle solution elegante retenir. Pour le moment, j'ai triche en modifiant ma classe CPoint2D, en "linearisant" l'espace 2D sur une ligne loooongue ce qui rend l'operateur < plus "juste" : CPoint2D p1( 108, 96 ) et CPoint2D p2( 96, 108 ) seront bien rendu different.
Marsh Posté le 20-10-2008 à 18:01:32
Bonjour, j'utilise assez massivement la map de la stl, avec succes... jusqu'a present. Il s'agit d'associer des index et une classe super petite, qui contient deux elements : une longueur et un enum pouvant prendre quelques valeurs. La voici :
Ensuite, je construit ma map comme suit :
C'est inscrit dans une boucle qui genere toutes les possibilites de longueur et de valeurs de l'enum, il y a 28 entrees en tout.
Le probleme est lorsque je cherche a acceder a mes donnees associee a une cle : donc dans la fonction de comparaison.
Si je defini la fonction de comparaison comme suit :
La map sort parfois les mauvaises cles, car seule la longueur est testee : apparemment, si la longueur est bonne, je me retrouve avec une donnee erronne dans l'enum (bonne longueur, mauvais enum...)
J'ai essaye comme montre dans la definition de la classe avec une comparaison de l'enum, marche pas : je me retrouve avec des retours vraiment errones sur la longueur...
Mais je comprend pas vraiment pourquoi ? Et surtout comment reussir a associer mes cles/index comme je le veut
Avez-vous une idee ? Merci !
---------------
Un blog qu'il est bien