Boost::multi_arrayをfor文でイテレートする

multi_arrayは次元毎にa[0][1][2]のように指定する. 普通にすべての要素をループ仕様と思い, a.begin()などのようにイテレータをとってくるとハマります. どうやらこのイテレータはa[0], a[1], ...のようになっているらしく, 個々の値をイテレートしているわけではありません.

単にすべてをループさせたいだけであれば,

boost::multi_array<double, 3> ma(boost::extents[3][4][2]);  

for (boost::multi_array<double, 3>::element_type
  *i(ma.data()), *e(ma.data() + ma.num_elements()); i != e; ++i)  
{  
  ; // do something with i
}

とすれば良さげ.

http://stackoverflow.com/questions/5572464/how-to-traverse-a-boostmulti-array

あるいは以下の例の中にあるfor_each.hppを使えばファンクタ渡しでいけるっぽいです.

http://www.boost.org/doc/libs/1_46_1/libs/multi_array/example/