2009年1月28日水曜日

boost::multi_array に algorithm 適応

 前回の記事で、がっくしきたが、一応解決方法を提示

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;
}
std::random_shuffle( &ma[i][0], &ma[i][y-1] + 1 );
}
for( int i = 0; i < x; ++i ) {
for( int j = 0; j < y; ++j ) {
std::cout << ma[i][j] << ",";
}
std::cout << std::endl;
}
}

&ma[i][y-1] は、配列の末端のアドレスにあたるわけだが、これに +1 をしてやれば、&ma[i][y] に等しいアドレス、すなわち end() に相当するアドレスが得られる。
 +1 に違和感を持つ人もいるかもしれないので補足すると、型が int のポインタなので、+1 する事で、sizeof(int*)sizeof(int) × 1 が加算される。

追記: iterator 使えるじゃんかよ… orz
追記(2009/03/14): boost_1_38_0 時点での multi_array は、1次元配列から自前で計算した方が速いようだ。

0 件のコメント: