2010-01-20 5 views
10

J'essaie de définir un type de unordered_map qui a une fonction de hachage personnalisée et une fonction de comparaison d'égalité. Les prototypes de fonction de ces fonctions sont les suivantes:Définition de la fonction de hachage personnalisée et de la fonction d'égalité pour unordered_map

//set<Vertex3DXT*> is the type of the key; Cell3DXT* is the type of the value 
size_t VertexSetHashFunction(set<Vertex3DXT*> vertexSet); //hash function 
bool SetEqual(set<Vertex3DXT*> a, set<Vertex3DXT*> b); //equality 

Je ces prototypes de fonction déclarée, puis j'essaie de déclarer le type comme suit:

typedef std::tr1::unordered_map<set<Vertex3DXT*>, Cell3DXT*, VertexSetHashFunction, SetEqual> CellDatabaseMapType; 

Mais il est dit que le VertexSetHashFunction et SetEqual sont arguments de type de modèle non valides. La documentation est confuse car elle ne dit pas exactement quel type les arguments du template sont supposés être - je suis juste supposé lui donner la fonction comme je l'ai fait ici, ou y at-il un autre type d'objet qui encapsule la fonction (parce que la documentation parle du "type d'objet de fonction de hachage")?

+0

Vous êtes toujours intéressé par cette question? – Omnifarious

+0

Merci pour le rappel - une des réponses était la réponse que je voulais, j'ai juste oublié de l'accepter. Je viens de l'accepter maintenant. – Alex319

Répondre

9

Ces fonctions doivent être déclarées en tant qu'opérateur() dans une classe, malheureusement. Comme ceci:

class VertexSetHashFunction { 
    public: 
    ::std::size_t operator()(const ::std::set<Vertex3DXT*> &vertexSet) const; 
}; 
class SetEqual { 
    public: 
    bool operator()(const ::std::set<Vertex3DXT*> &a, const ::std::set<Vertex3DXT*> &b) const; 
}; 

Vous n'avez pas besoin de modifier les arguments pour être des références const, mais je le recommande fortement. Faire une copie d'un fichier :: std :: set est relativement coûteux et vous ne devriez pas le faire à moins d'y être obligé. La constante de fin est juste parce que l'opérateur ne modifie pas du tout l'état de la classe, principalement parce qu'il n'y en a pas. C'est juste gentil de le dire explicitement.

Alternativement, vous pouvez définir votre propre spécialisation du modèle :: std :: hash. Je recommande réellement ceci s'il y a une manière standard que vous voulez que l'ensemble particulier hashed parce que ce modèle est utilisé par défaut si vous ne fournissez pas une fonction de hachage à unordered_map ou unordered_set et toute autre chose qui a besoin d'une fonction de hachage.

5

Vous avez besoin de foncteurs.

struct VertexSetHashFunction { 
    size_t operator() (const set<Vertex3DXT*>& vertexSet) const { return /*whatever*/; } 
}; 

struct SetEqual { 
    bool operator() (const set<Vertex3DXT*>& a, const set<Vertex3DXT*>& b) const { return /*whatever*/; } 
}; 
+1

Retour 0 est une idée terrible. – njamesp

+9

@njamesp: Vous pensez sérieusement que je veux que l'OP mette en place la fonction exactement comme ça quand j'écris 'return false;' dans SetEqual? * sigh * – kennytm

+0

Notez, comme dans l'exemple de KennyTM, que les foncteurs pourraient aussi être des structures. –

Questions connexes