DOSEIの日記

技術メモ+日常ログ

多次元配列

捨てコードだと、画像の画素値を格納した変数として、

  int I[2000][1000] = { {0} };

なんてやっちゃうよね。んで、サイズが大きいとメモリがスタックに確保できないで、セグフォが出ちゃう。
しょうがないから、初心に帰って、

  int* I = new int[2000*1000];

とかすると思うんだけど、こうすると、

  I[x][y] = 100; // NG! => should be I[x*1000+y]

みたいなアクセスができなくて、コードが美しくない。

こんな時は、

  int (*I)[1000] = reinterpret_cast<int(*)[1000]>(new int[2000*1000]);

って宣言すれば、ばっちりだ! I[x][y] でアクセス可能!

結論

よい子は、

  vector< vector<int> > I(2000, vector<int>(1000));

ってやればいいと思うよ。

注意

現在の C++ の規格では、配列のサイズを変数で (たとえ const がついていても) 指定できないから注意*1。唯一できるのは、最後の vector だけ。とはいえ、 GCC とか、モダンコンパイラなら独自拡張で指定可能。そんな時は、 -ansi とか -pedantic とかつけて、エラーになっちゃえばいいよ。

参考

にあるように、サイズが定数なら new T[n][m] とできる。この時、変数は delete[] で消していいらしいが、仕様上はどうなってるかは不明。

*1:const 変数なら可能。 C だと不可