Bonjour,
j'ai une classe Point3D<T> définie ainsi:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 template <class T> class Point3D { public: T x,y,z; // coords Point3D(); ~Point3D(); Point3D(T x,T y,T z); // copy constructor Point3D(const Point3D<T> &); // assignation operator Point3D<T> & operator=(const Point3D<T> &); // equality operator bool operator== (const Point3D<T> &); }; #include "Point3D.cpp"
Point3D.cpp contient entre autres ceci pour utilisation avec des unordered_map:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 ... /* we need to specialize the hash function for our class because standart hash function works only with basic types such as string,int,etc... */ // hash function for Point3D <-> Pixel template <class T> struct hash_point3d { size_t operator()(const Point3D<T> &p3d ) const { return hash<const Point3D<T> *>()(&p3d); // hash code is made with address !!! } }; // equality test, mainly used with hash tables template <class T> struct point3DEquals : binary_function<const Point3D<T>&, const Point3D<T>&, bool> { bool operator()( const Point3D<T>& lhs, const Point3D<T>& rhs ) const { return (&lhs == &rhs); // i compare the addresses !!! } }; // equality operator template <class T> bool Point3D<T>::operator== (const Point3D<T> &p3d) { return (x==p3d.x) && (y==p3d.y) && (z==p3d.z); } ...
j'ai aussi une classe Point2D et je veux associer des Point3D projetés sur un plan en Point2D liés entre eux par une table de hachage, unordred_map pour commencer:
je peux donc écrire cette définition :
et ça marche, mon code compile et fonctionne mais je me demande si j'aurai pas intérêt, dans un pur souci d'efficacité à définir ma table de hachage comme ceci:
Code : Sélectionner tout - Visualiser dans une fenêtre à part unordered_map<Point3D<float>,Point2D<int>,hash_point3d<float>,point3DEquals<float>> htPointPixel;
j'ai l'impression que à l'exécution les pointeurs seront plus légers que des objets Point3D à manipuler (constructeur de recopie....etc)
Code : Sélectionner tout - Visualiser dans une fenêtre à part unordered_map<Point3D<float> *,Point2D<int> *> htPointersPointPixel;
dans le code (coté développement) ce sera peut-être l'inverse et surement moins élégant.
des opinions sur l'une ou l'autre de ces méthodes ?
Damien
PJ: la classe complète Point3D est en pièce jointe
Partager