2016-03-29 3 views
0

私はgoogleで検索しましたが、一次元配列の回答しか見つかりませんでした。3次元配列をC++で指し示す

私は後で機能によって処理されるデータを格納する3次元配列を持っています。 私の配列はlevelcode[400][20][100]のようになります。デコードレベル関数が必要とするすべての情報を格納します。すぐにスタックオーバーフローエラーが発生します。

しかし、配列全体をどのように参照して値を取得できますか(または配列全体をどのように渡すのですか)?

私は技術的に各既存のパラメータの関数を呼び出すことができますが、私はそれが速くなるだろうと思うし、全体の配列が渡されたか、または何らかの並べ替えのポインタを使用して使用してください。 これをどのように達成できますか?

+0

このような質問に対する答えを読んだことがありますか?http://stackoverflow.com/questions/18283089/pointers-to-3d-arrays-c –

+0

'std :: array'を使用することは可能ですか?代わりに? – Tobias

+0

配列の宣言方法を示すコードを投稿できますか? – Chiel

答えて

1

std::vectorを使用することをおすすめします。これは基本的に自己管理型の成長可能アレイです。プログラムは自動的なオブジェクト(スタック)に対して与えられた小さなメモリの代わりに、完全なシステムメモリを使用するように、データを動的に格納します(ヒープ)。 levelcode[400][20][100]には、80万の要素があります。配列の型がintの場合、配列のために3.2MB以上のスペースが必要になります。通常、これはプログラムに提供されるスペースよりも大きく、aを引き起こします。stack overflow

私は単一次元ベクトルを使用することをお勧めします。そして、数学を使って3次元を偽造することができます。これにより、多次元配列は、多次元配列のように、各次元をすぐ隣に配置する必要がないため、データをよりキャッシュに適したものにします。

ので、代わりの

std::vector<std::vector<std::vector<some_type>>> name{DIM1, vector<vector<some_type>>{DIM2, vector<some_type>{DIM3}}}; 

を持つと我々は

std::vector<some_type> name{DIM1 * DIM2 * DIM3}; 

を持つことができ

name[x][y][z] 

のようにそれを使用して、あなたは

name[x*DIM2*DIM3 + y*DIM3 + z] 
で要素にアクセスすることができます
+0

私はそれを "偽造する"べきですか?私はちょうどそれらの3つを使用していますか? – MoustacheSpy

+0

私は、この例では何の例もなく、3次元を単一のものにマッピングする方法を説明することなく、良い答えを見つけることはできません。 – Chiel

+0

さらに、 'std :: vector'はもちろん最適なコンテナですが、なぜスタックの割り当てがオーバーフローするのかを実際には説明していません。 – Chiel

関連する問題