2016-04-09 7 views
0

これを表現する最良の方法を考える上で問題があります。多次元ベクトルまたは配列を使用して作業する

最初は、サイズがN×Nの2Dベクトルがあり、各要素はglm :: vec2です。

//initialize vector 
std::vector < std::vector < glm::vec2>> Gvectors; 

//allocate space 
Gvectors.resize(nGridCells + 1, std::vector<glm::vec2>(nGridCells + 1, glm::vec2(0.0f))); 

//fill data 
    for (size_t i = 0; i < nGridCells+1; i++) 
    { 
    for (size_t j = 0; j < nGridCells+1; j++) 
    { 
     float dx = something; 
     float dx = something else; 
     Gvector[i][j] = glm::normalize(glm::vec2(dx, dy)); 
    } 
    } 

ありません、私はすべての異なるサイズのこれらの2Dベクトルの複数を、したい:私はこのようにそれを初期化します。それらのそれぞれは、通常10x10から100x100の範囲の異なるサイズを持ちます。

だから私はそれはのようなものになるだろうので、別のネストされたベクトルを作ることを考えていた:

std::vector<std::vector <std::vector < std::vector < glm::vec2>>> Gvectors; 

しかし、トリプルベクトルのため、サイズ変更使用して領域を割り当てる方法を把握しようとしたとき、私は、ネストされたことを読んでベクターはメモリー割り当てに煩わしいことがあり、標準アレイを使用する方がしばしば良いことがあります。 しかし、私が配列を使用すると、2D配列のサイズがそれぞれ違うため、問題が発生すると思います。

私は何を求めているのでしょうか、これを表現する最良の方法は何ですか。基本的に2Dベクトルのベクトルまたは2D配列の配列。私は2Dベクトルの配列を作ることも試みていましたが、それを行う最良の方法ではないと思います。

FYIでは、ベクトルのサイズは初期化後も変更されません。

ありがとうございます!

+0

ありがとうございました。 – remi000

答えて

1

一般的には名前を付けることをお勧めします。

たとえば、2Dベクトルを呼び出すとします。行列の数、およびそのサイズと内容が実行時に変化する可能性があることを表現するための合理的な方法です。確かに

あなたはMatrixのようなクラスを定義する方法

std::vector<Matrix> const matrices = something; 

のように、constを使用して、初期化子を追加し、その後、この情報は、初期化した後、実行時に変化しないことを表現したい一方、場合必要があります多くのSOの質問でカバーされていますが、簡単な検索ではそれを見つけることができませんでした。実際にはSO C++配列のFAQに載っているはずですが、そこに答えると無数の詳細が議論されます。だから、要するに、最も合理的な方法は、IMO

  • ストレージ用std::vectorを使用し、マトリクスサイズを追跡する、

  • が線形アレイを提供する非パブリックメンバ関数index_ofを定義しています指定された行/列の位置のインデックス、

  • item,at,operator()などのアクセス用のパブリックメンバー関数を提供します。

あなたがアクセスのためのoperator[]を定義することを選択し、ちょうどそれがポインタを返す聞かせて代わりにした場合、その後、あなたがindex_ofを必要としない、それがより効率的にすることができますが、あなたはチェックの範囲にする能力を失います列索引にブレークポイントを設定する一般的な機能は失われます。だから一般的であまり再利用できないソリューションです。それでも、それはオプションとして存在し、両方を持つことができます。

+0

ありがとうございます。私は実際に私の問題を攻撃する全く新しい方法を発見したので、実際にはこの行列はもう必要ありません。しかし、あなたのソリューションは後で便利になるでしょう。とにかく、これは基本的に、私がEigenのようなライブラリを含めると使えるものです。 – remi000