将std :: vector转换为另一个std :: vector

Yol*_*ola 1 c++ vector

我需要将三角形矢量转换为三倍更长的索引向量:

struct Triangle { int16_t v[3] };

std::vector<Triangle>
std::vector<int16_t>
Run Code Online (Sandbox Code Playgroud)

也许我可以以某种方式将已初始化的矢量的迭代器从它封装的原始内存中转换出来?

编辑:这是真的,我不想要任何副本.

rod*_*igo 5

你不能这样做.

但是你可以这样做:

std::vector<Triangle> ts;
__int16 *pvbegin = ts[0].v;
__int16 *pvend = pvbegin + 3 * ts.size();
Run Code Online (Sandbox Code Playgroud)

并使用该对pvbeginpvend作为迭代器范围.

我不确定它不是技术性的未定义行为,但它应该可以正常工作.为了确保添加static_assert某个地方是个好主意,例如:

static_assert(sizeof(Triangle) == 3*sizeof(int16_t), "Weird sizeof(Triangle)");
Run Code Online (Sandbox Code Playgroud)

  • @LightnessRacesinOrbit:为什么?如果不是这样,我会感到惊讶.没有额外的对齐要求,没有额外的填充要求.也许允许编译器在结构的末尾添加填充,但没有令人信服的理由这样做. (3认同)
  • @firda:不,这将取决于`std :: vector`的实现,这超出了平台ABI规范.将`Triangle(&)[N]`转换为`int16_t(&)[3*N]`可能没问题.但是将`vector <A>&`转换为`vector <B>&`是完全不同的.如果`vector`被实现为一对指针,它可能会起作用.但如果是指针和计数则不会.既然你不应该假设任何'vector'的实现,你绝对不应该**那样做. (2认同)