Für diejenigen von euch, die den Overhead von std::map
nicht leisten können (oder kann es nicht verwenden, weil Sie nicht Standardkonstruktor in der Klasse), aber Daten, die ist nicht so einfach, wie int
, schrieb ich a guide zu einer Lösung mit std::vector
, die Art von optimal ist, wenn Sie die Gesamtzahl der Elemente im Voraus kennen.
Das Handbuch enthält eine fully-working sample code, die Sie herunterladen und selbst testen können.
Die dort erwähnte Lösung geht davon aus, dass Sie die Kontrolle über den Klassencode haben, so dass Sie insbesondere einige Attribute hinzufügen können. Wenn dies noch nicht möglich ist, können Sie immer einen Wrapper um es hinzuzufügen:
class Wrapper {
UntouchableClass const& mInstance;
size_t dsID;
size_t dsRank;
size_t dsParent;
}
Außerdem, wenn Sie die Anzahl der Elemente kennen, klein zu sein, gibt es keine Notwendigkeit für size_t
, in welchem Fall Sie einige Vorlage hinzufügen für den UnsignedInt
Typ und entscheide dich in der Laufzeit, ihn mit uint8_t
, uint16_t
, uint32_t
oder uint64_t
zu instanziieren, die du sonst mit <cstdint>
in C++ 11 oder mit boost::cstdint
erhalten kannst.
template <typename UnsignedInt>
class Wrapper {
UntouchableClass const& mInstance;
UnsignedInt dsID;
UnsignedInt dsRank;
UnsignedInt dsParent;
}
Hier ist der Link wieder, falls Sie es verpasst haben: http://janoma.cl/post/using-disjoint-sets-with-a-vector/
Dies könnte besser funktionieren, wenn Sie ein Beispiel zur Verfügung gestellt, was Sie erreichen wollen. –
Wow, sieht aus wie viele Leute neugierig sind und nicht viele haben eine Idee, wie man es überhaupt anfangen kann. – wheaties
gab es mindestens ein einfaches Beispiel für die Verwendung von SO: http://StackOverflow.com/Questions/3738537/implementing-Equivalence-relations-in-C-using-boostdisjoint-sets – Cubbi