【发布时间】:2015-10-27 04:38:09
【问题描述】:
我正在开发一款游戏,我发现自己经常检查某些数量是否在代表我的世界的向量所接受的索引范围内:
if(a >= 0 && a < 16 && b >= 0 && b < 16 && c >= 0 && c < 16 &&
d >= 0 && d < 16 && e >= 0 && e < 16)
{
//do things with vector[a][b][c][d][e]
}
我经常需要检查比这更多的条件。有没有办法让这些检查更简洁和/或更易于阅读?
或者,有没有办法可以完全避免进行检查?向量为16x16x16x16x16;我可以这样做吗,如果我给它一个 16 作为索引,它除了段错误什么都不做?
【问题讨论】:
-
写一个
inRange()函数并在所有变量上调用它? -
这是一个 x-y 问题。最好将 4 个点和 4 个键组合成
QRect之类的东西,并使用bool QRect::contains(const QPoint & point, bool proper = false) constdoc.qt.io/qt-5/qrect.html#contains 之类的方法 -
首先,如果索引超出范围,我认为“什么都不做而不是段错误”是不明智的。原因很简单,调用代码可能假设它有一个正确的索引,这意味着错误会通过程序传播。但是,如果这无关紧要,您可以将 16x16x16x16x16 向量替换为单个向量,并使用位移位计算索引,这相对较快并且避免了跳过数组的开销。顺便说一句,如果大小 16 是固定的,那么
i != (i&15)中的任何i都是无效的。最后,可以选择使用vector::at()。 -
为了检查 0 和上限,如果您将类型转换为无符号值,负数会变得非常大。这使您可以通过一次比较来检查两个边界。
-
@KaiSchmidt 这些是一回事。坐标 (a,b,c,d,e) 指定五维空间中的一个点,您想知道该点是否在由这些变量的所有有效组合组成的五维矩形内。您缺少的见解是 a、b、c、d 和 e 的所有有效组合的共同点是它们表示特定矩形内的一个点,所有无效组合都在外部。
标签: c++