Para aquellos de ustedes que no pueden pagar los gastos indirectos de std::map
(o no se puede utilizar porque no tiene constructor por defecto en su clase), pero cuyos datos no es tan simple como int
, escribí a guide a una solución usando std::vector
, que es algo óptimo cuando se conoce el número total de elementos de antemano.
La guía incluye un fully-working sample code que puede descargar y probar por su cuenta.
La solución mencionada allí supone que usted tiene el control del código de la clase para que, en particular, pueda agregar algunos atributos. Si esto aún no es posible, siempre se puede añadir una envoltura alrededor de él:
class Wrapper {
UntouchableClass const& mInstance;
size_t dsID;
size_t dsRank;
size_t dsParent;
}
Por otra parte, si se conoce el número de elementos a ser pequeña, no hay necesidad de size_t
, en cuyo caso se puede añadir un poco de plantilla para el tipo UnsignedInt
y decide en tiempo de ejecución crear una instancia con uint8_t
, uint16_t
, uint32_t
o uint64_t
, que puedes obtener con <cstdint>
en C++ 11 o con boost::cstdint
en caso contrario.
template <typename UnsignedInt>
class Wrapper {
UntouchableClass const& mInstance;
UnsignedInt dsID;
UnsignedInt dsRank;
UnsignedInt dsParent;
}
Aquí está el enlace de nuevo en caso de que no: http://janoma.cl/post/using-disjoint-sets-with-a-vector/
Esto podría funcionar mejor si se ha proporcionado un ejemplo de lo que quiere lograr. –
Guau, parece que mucha gente es curiosa y no muchos tienen una idea de cómo comenzar a usarlo. – wheaties
había al menos un ejemplo simple de uso en SO: http://stackoverflow.com/questions/3738537/implementing-equivalence-relations-in-c-using-boostdisjoint -sets – Cubbi