在C++中使用简单数组?

fdh*_*fdh 1 c c++ arrays algorithm containers

我有一个正方形网格.每个方格都是黑色或白色.网格范围从X:-10到10和Y:-10到10.我想用二维数组bool表示网格 - 黑色为真,白色为假.数组索引只是正数 - 所以如果我想用数组创建网格,那就是bool array [21][21].这样做可以,但是当我尝试访问元素时会让人感到困惑.例如,如果我想访问网格上的坐标"0,3",我的数组索引将是[11] [14].这有效,但它真的很乱.

有没有"更清洁"的方法我可以让索引与坐标相对应?

Dav*_*eas 6

您可以将逻辑封装到提供所需接口的类中.为了使它有点通用,您可以考虑要存储的类型和尺寸可能会有所不同:

 template <typename T, int DimX, int DimY>
 class offset_array2d
 {
    T data[ DimX*DimY ];
    static const int offset_x = DimX / 2;
    static const int offset_y = DimY / 2;
 public:
    offset_array2d() : data() {}
    T& operator()( int x, int y ) {
       return data[ (x+offset_x) + (y+offset_y)*DimY ];
    }
    T const & operator()( int x, int y ) const {
       return data[ (x+offset_x) + (y+offset_y)*DimY ];
    }
 };
Run Code Online (Sandbox Code Playgroud)

实现可能需要一些细节,但一般的想法是存在的.应该有错误报告和更多的东西......维度可以成为运行时属性(而不是模板参数)但需要动态分配,正确的析构函数和复制构造函数......我真的不想进入这一切只是为了这个想法.

频谱的另一端是用户代码,现在非常简单:

 int main() {
    offset_array2d<bool,21,21> board;
    for ( int i = -10; i < 11; ++i )
      board( i, i ) = true;          // write the diagonal
 }
Run Code Online (Sandbox Code Playgroud)