2009年1月28日水曜日

C++ 2次元配列の確保

 ふと、動的に2次元配列を構築したいと思い。あれれ?どんな構文だったっけかな?と、検索してみたが、意外に情報源が無い。見つかったのは、動的にポインタの1次元配列を構築し、for 文で各列に対して2次元目の配列を構築するという方法。これは、ちょっとどうなの?って内容だ。
 2次元目以後の長さが決まっているならば、

int len = 10;
int (*tes)[4] = new int [len][4];

のように一発で確保できるのだが、そうでなければ1次元配列を確保して、自分でマッピングするより無さそう。新しい規格だと、この辺も改善されていたような…ないような…。不勉強で、よくわからない(そんな時間もない)。
 で、boost::multi_array で試してみたら、これで十分じゃんという結論に…。

#include <iostream>
#include <boost/multi_array.hpp>

void multi_array_test( int x, int y ) {
boost::multi_array<int,2> ma( boost::extents[x][y] );
for( int i = 0; i < x; ++i ) {
for( int j = 0; j < y; ++j ) {
ma[i][j] = i + j;
}
}
for( int i = 0; i < x; ++i ) {
for( int j = 0; j < y; ++j ) {
std::cout << ma[i][j] << ",";
}
std::cout << std::endl;
}
}

int main() {
int x = 10;
int (*tes)[4] = new int [x][4];
for( int i = 0; i < x; ++i ) {
for( int j = 0; j < 4; ++j ) {
tes[i][j] = i + j;
}
}
for( int i = 0; i < x; ++i ) {
for( int j = 0; j < 4; ++j ) {
std::cout << tes[i][j] << ",";
}
std::cout << std::endl;
}
delete [] tes;
std::cout << "---------------" << std::endl;
multi_array_test( 3, 4 );
std::cout << "---------------" << std::endl;
multi_array_test( 4, 6 );
return 0;
}

追記:
 しかし、algorithm が使えない… orz

std::random_shuffle( &ma[i][0], &ma[i][y] );

とやると、Assertion failed: size_type(idx - index_base[0]) < extents[0]
ちょっと~~~~~~~
追記(2009/03/14): boost_1_38_0 時点では、multi_array のパフォーマンスは良いとは言えない

0 件のコメント: