Pour ceux d'entre vous qui ne peuvent pas se permettre les frais généraux de std::map
(ou ne peut pas l'utiliser parce que vous n'avez pas constructeur par défaut dans votre classe), mais dont les données ne sont pas aussi simple que int
, je l'ai écrit a guide à une solution en utilisant std::vector
, ce qui est plutôt optimal lorsque vous connaissez le nombre total d'éléments à l'avance.
Le guide comprend un fully-working sample code que vous pouvez télécharger et tester par vous-même.
La solution mentionnée ici suppose que vous avez le contrôle du code de la classe afin que vous puissiez en particulier ajouter certains attributs. Si cela est toujours pas possible, vous pouvez toujours ajouter une enveloppe autour:
class Wrapper {
UntouchableClass const& mInstance;
size_t dsID;
size_t dsRank;
size_t dsParent;
}
De plus, si vous connaissez le nombre d'éléments à petit, il n'y a pas besoin de size_t
, auquel cas vous pouvez ajouter un peu de modèle pour le type UnsignedInt
et décider à l'exécution de l'instancier avec uint8_t
, uint16_t
, uint32_t
ou uint64_t
, que vous pouvez obtenir avec <cstdint>
en C++ 11 ou avec boost::cstdint
sinon.
template <typename UnsignedInt>
class Wrapper {
UntouchableClass const& mInstance;
UnsignedInt dsID;
UnsignedInt dsRank;
UnsignedInt dsParent;
}
Voici le lien à nouveau dans le cas où vous l'avez manqué: http://janoma.cl/post/using-disjoint-sets-with-a-vector/
Cela pourrait fonctionner mieux si vous avez fourni un exemple de ce que vous voulez atteindre. –
Wow, on dirait que beaucoup de gens sont curieux et pas beaucoup ont une idée de comment commencer à l'utiliser. – wheaties
il y avait au moins un exemple simple d'utilisation sur SO: http://stackoverflow.com/questions/3738537/implementing-equivalence-relations-in-c-using-boostdisjoint-sets – Cubbi