c ++ - приведение вектора <T>к вектору - PullRequest
1 голос
/ 24 февраля 2020

У меня есть std :: vector простого типа данных, и я хотел бы преобразовать его в O (1) в std :: vector std :: массивов того же простого типа данных.

In конкретные обе формы представляют собой массив всех индексов вершин треугольника me sh. Они оба содержат одинаковое количество индексов, в абсолютно одинаковом порядке, у них просто разные понятия границ.

Так, например,

std::vector<uint32_t> X;
std::vector<std::array<uint32_t, 3>> = < ??? > (X);

1 Ответ

1 голос
/ 25 февраля 2020

std::vector не подходит для этого. std::vector является владельцем, таким образом, если вы хотите переосмыслить память, выделенную X как «вектор» массивов целых чисел, вы должны использовать не владеющий контейнером, например std::span. Даже в этом случае вам придется использовать reinterpret_cast, что рекомендуется по возможности избегать. Например:

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

Остерегайтесь, хотя, в зависимости от количества значений в массиве std ::, в который вы преобразуетесь, вы можете столкнуться с проблемами из-за заполнения: последовательные массивы не должны касаться каждого другие в памяти.

По всем этим причинам я бы рекомендовал либо перебирать каждый третий элемент, либо предоставлять класс-оболочку вокруг X, который инкапсулирует сильную связь semanti c между собственными данными и взгляд на это. Это также потому, что представление теперь эфемерно: его нужно пересоздавать всякий раз, когда X перераспределяет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...