2011-12-04 7 views
1

こんにちは、私はベクトルの使用についての質問がC + +で、私はランダムな動きでコンテナを介して粒子の動きをシミュレートする問題に取り組んでいます。粒子を追加したり削除したりする必要があります。これは特定の基準を満たすことができないため、ベクトルクラスが非常に便利だとわかりましたが、私はC++を初めて使用しています。std :: vectorディメンション、 "テトリス"シェイプは使用できますか?

定義した2次元配列は、長方形か正方形のどちらかに限定されていますか?私は、各容器に粒子の位置を保存するだけです。私が恐れているのは、私の行列が次のようになるということです:

| | | | |

| | | | |

| | | | |

| | | | |

(4x4の場合)列の入力が各ビン/コンテナ内の粒子の位置であり、ビンとビンとの粒子数が異なる場合、このようなものが可能かどうか疑問に思う。

| | | | |第1ビン内の4つの粒子

| | |第2のビン内の2個の粒子を含み、占有されたメモリは上記より2倍小さい。

| | | | | | | | | | | | | | | | |これは3番目のビン内にたくさんあります。

また、私が自分のアルゴリズムを実装する方法に応じて、行の要素を削除する(行のサイズを小さくする)か、要素を行に追加する(行のサイズを大きくする)か、列に追加する必要があります。ときに、最初にvector<vector<Particle> >

+1

ベクターは、一次元のみを持っています。あなたは(「ギザギザ」)好きならベクトルのベクトルを持っている、または多次元(「長方形」)アレイのためBoost.MultiArrayを使用することができます。 –

答えて

3

あなたはベクトルのベクトルを使用することができます「2次元配列...限定された...長方形または正方形」について質問すると、「ぎざぎざ」の配列(長方形ではないが固定された「高さt "、行ごとに可変"幅 ")。

しかし、"tetris" shapestetraminos)は、特にギザギザの配列には適していません。それは私が実際にa sparse arrayがほしいと思うようにする。つまり、パーティクルの位置だけを格納し、非パーティクルの位置は格納しません。

これを行う最も簡単な方法は、グリッドをスキップし、占有されているスペース/パーティクルの位置のリストをそのまま維持することです。

struct Position 
{ 
    float X; 
    float Y; 
}; 

// ... 

std::vector<Position> particles; // std::list works too... 

しかし、単純なリストは、いくつかの目的ではあまり効率的ではありません。空間的に索引付けされたアクセスが必要な場合、たとえば、シミュレーション内の特定のボリューム/領域に含まれるパーティクルの数を確認する場合は、a space partitioning data structureを使用して、まばらな人口を許可する必要があります。

人々は通常、長方形のグリッドを使って説明したようにして、の中にグリッドセルに含まれるパーティクルの各グリッド位置を保存します。しかし、これは、使用されていないグリッドセルの「スペースを無駄にする」。それは、まばらな人口問題を解決するものではありません。

空間索引とまばらな人口の両方をサポートする一般的なデータ構造がa quadtreeです。

+0

ジャグ配列(ベクトルのベクトルは、ジャグ配列では)まだ占有グリッドセルの「左」にスペースを無駄でしょう。まだ空の内容のセルがあります。 –

0

:一般的な間違いがある場合、私は1つを作るために確信しているように、複数の次元のベクトルを扱うプログラミング言語に新しいものとき:)

関連する問題