Для тех из вас, кто не может позволить себе накладные расходы std::map
(или не может использовать его, потому что у вас нет конструктора по умолчанию в вашем классе), но данные которого не так просты, как int
, Я написал руководство для решения с использованием std::vector
, что является оптимальным, если заранее знать общее количество элементов.
Руководство содержит полностью рабочий пример кода , который можно загрузить и протестировать самостоятельно.
Упомянутое там решение предполагает, что у вас есть контроль над кодом класса, чтобы, в частности, вы могли добавить некоторые атрибуты. Если это все еще невозможно, вы всегда можете добавить обертку вокруг него:
class Wrapper {
UntouchableClass const& mInstance;
size_t dsID;
size_t dsRank;
size_t dsParent;
}
Более того, если вы знаете, что количество элементов небольшое, нет необходимости в size_t
, и в этом случае вы можете добавить некоторый шаблон для типа UnsignedInt
и решить во время выполнения создать его экземпляр с помощью uint8_t
, uint16_t
, uint32_t
или uint64_t
, которые можно получить с помощью <cstdint>
в C ++ 11 или с помощью boost::cstdint
в противном случае.
template <typename UnsignedInt>
class Wrapper {
UntouchableClass const& mInstance;
UnsignedInt dsID;
UnsignedInt dsRank;
UnsignedInt dsParent;
}
Вот снова ссылка на случай, если вы ее пропустили: http://janoma.cl/post/using-disjoint-sets-with-a-vector/