Pour ceux d'entre vous qui ne peuvent pas se permettre les frais généraux de l' std::map
(ou ne pouvez pas l'utiliser parce que vous n'avez pas de constructeur par défaut dans votre classe), mais dont les données n'est pas aussi simple qu' int
, j'ai écrit un guide pour une solution à l'aide d' std::vector
, ce qui est optimal lorsque vous connaissez le nombre total d'éléments à l'avance.
Le guide inclut pleinement-travail exemple de code que vous pouvez télécharger et de le tester sur votre propre.
La solution qu'il suppose que vous avez le contrôle de la classe dans le code de sorte que, en particulier, vous pouvez ajouter quelques attributs. Si ce n'est toujours pas possible, vous pouvez toujours ajouter un wrapper autour d'elle:
class Wrapper {
UntouchableClass const& mInstance;
size_t dsID;
size_t dsRank;
size_t dsParent;
}
Par ailleurs, si vous connaissez le nombre d'éléments à petit, il n'y a pas besoin d' size_t
, dans ce cas, vous pouvez ajouter un peu de modèle pour l' UnsignedInt
type et de décider en 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 de nouveau le lien au cas où vous l'auriez manqué: http://janoma.cl/post/using-disjoint-sets-with-a-vector/