2

フレームごとに値のコレクションを生成していますが、これらの値を特定のインデックスのより大きな値のコレクションに追加したいと思います。

これは私が生成しているコレクションの典型的な例です

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);

フレームごとに生成するオーバーヘッドをあまりかけずに、小さいコレクションを効率的に生成して大きいコレクションにコピーするには、どのクラスタイプを使用できますか?

新しく生成された小さなコレクションをそれぞれ大きなコレクションの最後に割り当てることで、インデックス値を無視できるようになりました。

4

2 に答える 2

2

あなたのコードでは、すべき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 );

コピーではなく挿入する必要がある場合は、vertices.insert() を使用します。

于 2012-08-25T23:45:54.613 に答える
1

使用できますvector::insert。ベクトルのcorners位置の直前に値を挿入したい場合は、次のようにします。indexvertices

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

ただし、その操作には、新しい値のための余地を作る必要があります。これにより、すべての要素indexがベクターの末尾に移動します (おそらく、ベクターのサイズ変更も必要になるでしょう)。

それを避けるために、代わりに a を使用できますlist

于 2012-08-25T23:47:34.630 に答える