2010-01-20 7 views
10

Ich versuche, eine Art von ungeordneten Map zu definieren, die eine benutzerdefinierte Hash-Funktion und Gleichheitsvergleichsfunktion hat. Die Funktionsprototypen dieser Funktionen sind wie folgt:Definieren von benutzerdefinierten Hash-Funktion und Gleichheitsfunktion für 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 

Ich habe diese Funktionsprototypen deklariert und dann versuche ich, die Art zu erklären, wie folgt:

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

Aber es sagt, dass die VertexSetHashFunction und SetEqual sind keine gültigen Vorlagenargumente. Die Dokumentation ist verwirrend, weil sie nicht genau sagt, welchen Typ die Vorlagenargumente haben sollen - soll ich ihr nur die Funktion geben, wie ich sie hier gemacht habe, oder gibt es ein anderes Objekt, das die Funktion kapselt (weil der Dokumentation spricht über den "Hash-Funktionsobjekttyp")?

+0

Interessiert Sie diese Frage noch? – Omnifarious

+0

Danke für die Erinnerung - eine der Antworten war die Antwort, die ich wollte, aber ich vergaß es einfach zu akzeptieren. Ich habe es jetzt einfach akzeptiert. – Alex319

Antwort

9

Diese Funktionen sollten leider als Operator() in einer Klasse deklariert werden. Gefällt mir:

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; 
}; 

Sie müssen die Argumente nicht ändern, um Const-Referenzen zu sein, aber ich würde es sehr empfehlen. Eine Kopie von a :: std :: set zu erstellen, ist relativ teuer und Sie sollten es nur tun, wenn Sie es unbedingt tun müssen.

Das abschließende const ist nur, weil der Operator überhaupt nicht den Klassenstatus ändert, meistens weil es keine gibt. Es ist einfach schön, dies ausdrücklich zu sagen.

Alternativ könnten Sie Ihre eigene Spezialisierung der :: std :: Hash-Vorlage definieren. Ich würde das wirklich empfehlen, wenn es eine Standardmethode gibt, die diese bestimmte Menge hashen soll, weil diese Vorlage standardmäßig verwendet wird, wenn Sie keine Hashfunktion für unordered_map oder unordered_set und alles andere, das eine Hash-Funktion benötigt, bereitstellen.

5

Sie brauchen Funktoren.

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

Return 0 ist eine schreckliche Idee. – njamesp

+9

@njamesp: Sie denken ernsthaft, ich möchte das OP die Funktion genau so implementieren, wenn ich 'Return false;' in SetEqual schreibe? * seufz * – kennytm

+0

Hinweis: Wie in KennyTMs Beispiel könnten die Funktoren auch Strukturen sein. –

Verwandte Themen