2 pièce(s) jointe(s)
Table de hachage unordered_map et pointeurs vers objet ou objet, efficacité ?
Bonjour,
j'ai une classe Point3D<T> définie ainsi:
Code:
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:
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 :
Code:
unordered_map<Point3D<float>,Point2D<int>,hash_point3d<float>,point3DEquals<float>> htPointPixel;
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:
unordered_map<Point3D<float> *,Point2D<int> *> htPointersPointPixel;
j'ai l'impression que à l'exécution les pointeurs seront plus légers que des objets Point3D à manipuler (constructeur de recopie....etc)
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