J'ai un std::vector d'un type de données simple et j'aimerais le convertir en O(1) en un std::vector de std::arrays du même type de données simple.

En particulier, les deux formes représentent un tableau de tous les indices de sommet d'un maillage triangulaire. Ils contiennent tous les deux exactement le même nombre d'indices, exactement dans le même ordre, ils ont juste des notions différentes de frontières.

Alors par exemple,

std::vector<uint32_t> X;
std::vector<std::array<uint32_t, 3>> = < ??? > (X);
1
orion elenzil 24 févr. 2020 à 22:19

1 réponse

Meilleure réponse

std::vector n'est pas le bon outil pour cela. std::vector est propriétaire, donc si vous voulez réinterpréter la mémoire allouée par X en tant que "vecteur" de tableaux d'entiers, vous devez utiliser un conteneur non propriétaire tel que std::span. Même dans ce cas, vous devrez utiliser reinterpret_cast, ce qui est recommandé d'éviter autant que possible. Tel que:

std::span<std::array<uint32_t, 3>> points (reinterpret_cast<std::array<uint32_t, 3>*>(
    X.data()), X.size()/3);

Attention cependant, selon le nombre de valeurs dans le std::array dans lequel vous transposez, vous pourriez rencontrer des problèmes à cause du remplissage : les tableaux consécutifs n'ont pas à se toucher en mémoire.

Pour toutes ces raisons, je recommanderais plutôt d'itérer sur chaque troisième élément ou de fournir une classe wrapper autour de X, qui encapsule le lien sémantique fort entre les données détenues et la vue sur celles-ci. C'est aussi parce que la vue est désormais éphémère : elle doit être recréée à chaque réallocation de X.

1
Jan15 24 févr. 2020 à 21:09