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のコンテナ要件を満たすことを考えよう。