C++每帧更新和复制一系列值.我应该使用哪种类类型

C++. Updating and copying a series of values each frame. Which class type should I use?

本文关键字:我应该 类型 种类 一系列 更新 复制 C++      更新时间:2023-10-16

我在每帧生成一个值集合,我想将这些值添加到特定索引处的一个更大的值集合中。

这是我正在生成的集合的典型示例

std::vector<glm::vec3> corners;
corners.reserve(8);
//glm::vec3 corners[8];
//std::list<glm::vec3> corners;
corners[i++] = position - hX + hY + hZ;
corners[i++] = position + hX + hY + hZ;
corners[i++] = position + hX - hY + hZ;
corners[i++] = position - hX - hY + hZ;
corners[i++] = position - hX + hY - hZ;
corners[i++] = position + hX + hY - hZ;
corners[i++] = position + hX - hY - hZ;
corners[i++] = position - hX - hY - hZ;

然后,我有一个更大的glm::vec3值集合,我想将上面的值复制到特定索引中。

std::vector<glm::vec3> vertices;
vertices.assign(maxVertices, 0);

C#的等价物是

corners.CopyTo(vertices, index);

我可以使用什么类类型来有效地生成较小的集合并将其复制到较大的集合,而不会在每帧生成它时产生太多开销?

我可以将每个新生成的较小集合分配到较大集合的末尾,这样索引值就可以被忽略。

在代码中应该是corners.resize(8),而不是corners.reserve(8)。此外,如果我理解正确的话,你似乎总是有8个角?然后使用数组:

typedef std::array<glm::vec3, 8> Corners; 
// or in pre-c++0B code use boost::array same way
// or if neither is available then just raw glm::vec3[8] can do.

然后可以通过初始化完成填充:

// somehow we have position, hX, hY and hZ
Corners corners =
{
    position - hX + hY + hZ,
    position + hX + hY + hZ,
    position + hX - hY + hZ,
    position - hX - hY + hZ,
    position - hX + hY - hZ,
    position + hX + hY - hZ,
    position + hX - hY - hZ,
    position - hX - hY - hZ
};

可以使用标准副本进行复制:

std::vector<glm::vec3> vertices;
// somehow it gets filled
// somewhere comes index
std::copy( corners.begin(), corners.end(), vertices.begin() + index );
// with raw glm::vec3[8] std::copy( corners, corners + 8, vertices.begin() + index );

如果需要插入而不是复制,请使用顶点.insert()

您可以使用vector::insert。如果要在矢量verticesindex位置之前插入corners中的值,您可以执行以下操作:

vertices.insert(vertices.begin() + index, corners.begin(), corners.end());

然而,该操作需要为新的值腾出空间。这将把所有元素从index移到向量的末尾(也许还需要调整向量大小)。

为了避免这种情况,您可以使用list

相关文章: