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?
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
:
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%Tags und Links c++ qt hash containers