gridmap:イテレータを使えるようにしました。
こんな感じで。
... 省略 ... int main(){ typedef rect2d_gridmap<int>::type map_type; // -3 <= x <= 3, -3 <= y <= 3の範囲の矩形領域を作成 map_type map1(range(-3, 3, -3, 3)); // 全要素をトラバース std::copy( boost::counting_iterator<int>(0), boost::counting_iterator<int>(map1.size()), map1.begin()); std::cout << "map1: (0, 0) is at 24.\n" << std::endl; print_map(map1); // range(0, 2, 0, 2)を90度回転してx方向に2平行移動したものでmap1を参照して、 // map2にコピー std::cout << "map2( map1[range(0, 2, 0, 2) >> roatate90() >> translate(2, 0)] )\n" << std::endl; map_type map2( map1[range(0, 2, 0, 2) >> rotate90() >> translate(2, 0)] ); print_map(map2); // map1のrange(-1, 2, -1, 2)にmap1のrange(0, 3, 0, 3)にy軸に関して対称移動 // したものをコピー std::cout << "map1[range(-1, 2, -1, 2)] = map1[range(0, 3, 0, 3)] >> flipx()];\n" << std::endl; map1[range(-1, 2, -1, 2)] = map1[range(0, 3, 0, 3) >> flipx()]; print_map(map1); return 0; }
出力はこうなります。
map1: (0, 0) is at 24. 42 43 44 45 46 47 48 35 36 37 38 39 40 41 28 29 30 31 32 33 34 21 22 23 24 25 26 27 14 15 16 17 18 19 20 7 8 9 10 11 12 13 0 1 2 3 4 5 6 map2(map1[range(0, 2, 0, 2) >> roatate90() >> translate(2, 0)]); 24 31 38 25 32 39 26 33 40 map1[range(-1, 2, -1, 2)] = map1[range(0, 3, 0, 3)] >> flipx()]; 42 43 44 45 46 47 48 35 36 45 44 43 42 41 28 29 38 37 36 35 34 21 22 31 30 29 28 27 14 15 24 23 22 21 20 7 8 9 10 11 12 13 0 1 2 3 4 5 6
とりあえず形になったので、汚いところを整理して次はSTLのコンテナ要件を満たすことを考えよう。