Wie schreibe ich qHash für einen QSetSomeClass * -Container?

8

Ich muss eine Reihe von Sets in meiner Anwendung implementieren. Wenn Sie QSet mit einer benutzerdefinierten Klasse verwenden, müssen Sie eine qHash() -Funktion und eine operator== bereitstellen.

Der Code lautet wie folgt:

%Vor%

Wie kann ich qHash(QSet<Custom*>) implementieren, um QSet< QSet<SomeClass*> > verwenden zu können?

Bearbeiten:

Zusätzliche Frage: In meiner Anwendung kann der "Satzsatz" bis zu 15000 Sätze enthalten. Jede Teilmenge kann bis zu 25 benutzerdefinierte Klassenzeiger enthalten. Wie garantiert man, dass qHash(QSet<Custom*>) einzigartig genug ist?

    
Piotr 03.02.2012, 09:35
quelle

2 Antworten

4

Eine übliche Methode zum Hash-Containern besteht darin, die Hashes aller Elemente zu kombinieren. Boost bietet zu diesem Zweck hash_combine und hash_range . Dies sollte Ihnen eine Idee geben, wie Sie dies für die Ergebnisse Ihrer qHash implementieren können.

Also, angesichts Ihrer qHash für Custom :

%Vor%     
pmr 03.02.2012, 09:41
quelle
5

Sie können qHash nicht mit boost::hash_range / implementieren boost::hash_combine (was pmrs Antwort effektiv tut), weil QSet das Qt-Äquivalent von std::unordered_set ist und, wie der STL-Name andeutet, diese Container ungeordnet sind , während die Boost-Dokumentation angibt, dass hash_combine ist auftragsabhängig, d. es wird Hash-Permutationen zu verschiedenen Hash-Werten durchführen.

Das ist ein Problem, wenn Sie die Elemente naiv Hash-kombinieren in der gespeicherten Reihenfolge Sie können nicht garantieren, dass zwei Sätze, die gleich sind, tatsächlich gleich sind, was eine der Anforderungen einer Hash-Funktion ist:

%Vor%

Wenn also Ihre Hash-Combining-Funktion für jede Permutation der Eingabewerte die gleiche Ausgabe erzeugen soll, muss sie kommutativ sein. Glücklicherweise passen sowohl die (unsignierte) Addition als auch die xor-Operation genau zur Rechnung:

%Vor%     
Marc Mutz - mmutz 14.03.2014 10:36
quelle

Tags und Links