有效地处理OOB,2d阵列访问

时间:2012-03-15 23:03:14

标签: c++ arrays bounds

假设您正在尝试以棋盘格式访问数组:

  0 1 2 3 4 5 6 7
0 o • o • o • o •
1 • o • o • o • o
2 o • o • o • o •
3 • o • o • o • o
4 o • o • o • o •
5 • o • o • o • o
6 o • o • o • o •
7 • o • o • o • o

所以,假设你在这里访问黑色元素,并添加所有4个白色邻居。

你不能在边缘或角落处这样做,因为那里分别只有3个和2个白色邻居。因此,您最终会在边缘添加所有3个白色,并且 0 用于越界访问。

执行此操作的低效方法是执行类似

的操作
at each element
    if element to the right is not out of bounds ...

但我不想做这样的检查。

所以我所做的就是将循环切成条状,所以:

at each element ON LEFT EDGE
    add 3 elements i know are in bounds (right, up, down)

然后是角落的特殊情况

at top left corner..
    add 2 elements i know are in bounds (right, down)

所以这最终得到了一个非常长的代码,但没有约束检查。我正在寻找一种方法来减少代码块的长度,并使其更易于维护。

任何技巧?

1 个答案:

答案 0 :(得分:2)

一种可能的解决方案是填充数据。也就是说,添加一些具有中性值的边界。我已经用x - es说明了这一点。

    0 1 2 3 4 5 6 7
  x x x x x x x x x x
0 x o • o • o • o • x
1 x • o • o • o • o x
2 x o • o • o • o • x
3 x • o • o • o • o x
4 x o • o • o • o • x
5 x • o • o • o • o x
6 x o • o • o • o • x
7 x • o • o • o • o x
  x x x x x x x x x x

边界的实际“厚度”显然取决于你寻找每个元素的距离(你的窗口/内核宽度/高度)。在查看直接邻居的情况下,只需要一个大小为1的边界。

是的,这确实意味着您将处理更多的数据。但优点是,虽然您不得不考虑寻址,但角落/边界情况不再需要进行任何特殊检查。