我有一个已读入数组的网格化矩形文件。该网格化文件包含数据值和 NODATA 值;数据值在数组内部构成一个连续的奇数形状,NODATA 值填充其余部分以保持网格化文件为矩形。我对数据值执行操作并跳过 NODATA 值。
我对数据值执行的操作包括检查 8 个周围的邻居(当前单元格是 3x3 网格的中心)。当八个邻居中的任何一个是 NODATA 值时,我可以处理,但是当实际数据值落在第一行或最后一行/列中时,我会通过尝试访问不存在的数组值来触发错误。
为了解决这个问题,我考虑了三种选择:
添加带有 NODATA 值的新的第一行和最后一行/列,并相应地调整我的代码 - 我可以循环遍历内部“原始”数组并处理新的 NODATA 值,就像我已经处理的边缘一样不要落在第一行和最后一行/列中。
我可以创建特定的流程来处理第一行和最后一行/列中包含数据的单元格 - 修改过的 for 循环(一个逐步执行的 for 循环一个特定的序列/范围)只检查存在的周围单元格,但因为我仍然需要 8 个相邻值(NODATA/不存在的单元格被赋予与中央单元格相同的值)我必须将空白/NODATA 值复制到辅助 3x3 网格。虽然也许有办法避免二次网格。这个解决方案很烦人,因为我必须为所有角单元格(4 个不同的 for 循环)和第一行或最后一行/列中的任何单元格(另外 4 个不同的 for 循环)。对任何非边缘单元格使用单个 for 循环。
根据我的阅读,使用 map 似乎能够存储原始数组,同时让我搜索数组外的位置而不会触发错误。在这种情况下,我仍然必须给这些不存在的单元格一个值(等于数组的中心),因此可能也可能不需要设置辅助 3x3 网格;再一次,也许有一种方法可以避免二次网格。
解决方案 1 似乎最简单,解决方案 3 最聪明,而解决方案 2 最烦人。我缺少任何解决方案吗?或者这些解决方案中的一种是否应该成为明显的赢家?
最佳答案
我的建议是用函数替换对数组的所有读取访问。例如,arr[i][j]
by getarr(i,j)
。这样,您的所有算法代码都或多或少保持不变,并且您可以轻松地为超出范围的索引返回 NODATA
。
但我必须承认这只是我的意见。
关于c++ - 在 C++ 中使用 map 而不是 array 来保护在数组边界之外的搜索?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28425092/