Salut !
Je me demandais s'il était possible d'utiliser un couple de float (ou int) en clé d'une map et comment s'y prendre ??
genre :
typedef map< (float, float), struct...> matchedPairs;
voilà, merci de m'aider, je suis perdu !
@+
Kmouille
Version imprimable
Salut !
Je me demandais s'il était possible d'utiliser un couple de float (ou int) en clé d'une map et comment s'y prendre ??
genre :
typedef map< (float, float), struct...> matchedPairs;
voilà, merci de m'aider, je suis perdu !
@+
Kmouille
std::pair<float, float> pour la paire de floats. Par contre je ne pense pas que std::less ou l'opérateur < soient définis pour std::pair, tu auras donc sans doute à écrire le premier (ou un foncteur perso que tu passeras en 3ème paramètre template de ta map).
C'est mieux de définir son propre foncteur, non ?
Pour ce cas-là, sans doute oui. La comparaison entre deux pair<float, float> ne sera sûrement pas la même d'une application à l'autre, donc inutile d'aller trifouiller dans le namespace std.Citation:
C'est mieux de définir son propre foncteur, non ?
Merci !!! c'est bon, je viens en effet de reussir... je n'ai pas d'avertissement pour la fonction de comparaison, il doit y en avoir une deja faite.
Par contre, je me demande si la map est bien adaptée à mon algorithme, (j'ai consulté le tableau pour aider à choisir les conteneurs) mais voilà, l'algorithme que j'essaie de programmer me pose un probleme, le voici :
if (float_x, *) and (*,float_y) are not in map
then map.insert((float_x, float_y),...)
où * est un couple quelconque !
Je ne vois pas trop comment je peux parcourir les clés de la map et y appliquer ce test.
si quelqu'un comprend déjà c'est bien, et si vous pouviez m'aider c'est encore mieux :lol:
@+
Kmouille
qui dit float dit calcul, et qui dit calcul et float dit imprécision des calculs. Personellement, j'hésiterais à prendre un float comme clef de map ou de n'importe quoi d'autre, car je n'en sais clairement pas assez sur les nombres en virgule flottante pour être assuré que le code suivant marche (et d'ailleurs, je pense qu'il ne marche pas) :
Code:
1
2
3 map<float, int> m; m[1.0f] = 1; assert(m[0.1f+0.1f+0.1f+0.1f+0.1f+0.1f+0.1f+0.1f+0.1f+0.1f] == 1);
Cela ne marchera effectivement pas ...
Si l'application est d'unifier les points d'un maillage (model 3d ou qqc comme ca) je te conseillerai d'utiliser un octree ou quadtree, en limitant la nombre de subdivision. dans chaque case de l'octree il va y avoir une liste de points qui y appartient. comme ca tu peux comparer a un epsilon pres (pas moi ;) mais un nombre definissant la tolerance d'egalité) ton point par rapport a tous les points de la case.
... j'espere que mon explication est claire ...
a+