5

我需要一种非常快速的方法来检查数组的边界。我目前的检查范围是:

template<typename T>
class SmartArray {
    //...
    int size;
    T* array;
    T &operator[](int index) {
        if (index/size!=0)
            throw OUT_OF_RANGE; //#define OUT_OF_RANGE 0x0A
        return array[index];
    }
}

有更快的方法来检查索引是否超出数组范围?

编辑:

我的解决方案是用负索引制造麻烦。有办法解决这个问题吗?

4

5 回答 5

6

一般来说,除法是一个缓慢的操作,所以我会避免这种情况。

我认为一个简单的比较会更有效:

index >= size

index但是,这会错过小于 0的情况,但是如果您将unsignedorsize_t用于sizeandindex变量,那将不是问题。

所以它变成:

T &operator[](size_t index) {
    if (index >= size)
        throw OUT_OF_RANGE; //#define OUT_OF_RANGE 0x0A
    return array[index];
}
于 2012-09-26T16:47:45.073 回答
4

您的检查遗漏了负值:如果大小为5且索引为-1,则整数除法的结果为零,但索引显然超出范围。

您可以通过使index参数无符号来解决此问题。的类型也size应该如此size_t

于 2012-09-26T16:48:19.310 回答
3

是的,不要使用除法,因为除法很慢(如果 ,它会失败size == 0)。一个简单的

if(index >= size || index < 0)

会做得很好。

于 2012-09-26T16:46:38.280 回答
1

检查数组边界的最快方法是不检查。调用者operator[]应该负责确保他们知道自己在做什么,而不是用错误的索引调用它。

于 2012-09-26T17:28:37.167 回答
0

如果您将数组的大小限制为 2 的幂,您将能够使用掩码。size_t mask;即存储等于size-1( ) 的附加值== 2^n-1。然后可以进行检查:

T &operator[](size_t index) {
    return array[index & mask];
}
于 2018-05-28T20:09:58.060 回答