Один из подходов состоит в том, чтобы подкрепить ваши фактические данные данными из коллекции.
Для иллюстрации:
struct t_voxel {
size_t nPoints, minHeight, maxHeight, centorid;
};
struct t_voxel_id {
uint16_t index;
};
// one dimension
class t_voxel_collection {
// the actual voxel data needed for the indices represented by the collection of voxelId
std::vector<t_voxel> d_voxel;
// here, empty voxel is designated by t_voxel.index = 0
// this collection is your primary array representation
// these elements just refer to a unique or shared index in this->d_voxel
std::vector<t_voxel_id> d_voxelId;
public:
// >> the interface to access and set, which abstracts the backing collection.
// and prohibits the client from accessing the actual data.
t_voxel get(const size_t& idx) const {
return this->d_voxel[this->d_voxelId[idx].index];
}
// ...
};
Таким образом можно добиться значительного снижения потребления памяти (еслипосмотрите, в каком направлении это происходит).
Это не полный ответ, но может помочь в этом сценарии.
Существует несколько способов дальнейшей оптимизации и совместного использования данных вокселей в этой коллекции, в зависимости отна ваше использование.