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未満の場合を見逃しますが、および変数にunsignedまたはを使用する場合は、問題にはなりません。size_tsizeindex

したがって、次のようになります。

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 に答える