3

一般的な C++ ライブラリには、開発者が速度を犠牲にすることなく任意のインデックスを持つ配列を使用できるようにするクラス (または複数のクラス) がありますか?

この質問をより具体的な形式にするために、以下のようなコードを記述できるようにしたいと思います。

//An array with indices in [-5,6)
ArbitraryIndicesArray<int> a = ArbitraryIndicesArray<int>(-5,6);  
for(int index = -5;index < 6;++index)
{
    a[index] = index;
}
4

5 に答える 5

6

実際には、オフセットのあるベクトルを使用する必要があります。または、オフセットのある配列ですら。余分な足し算や引き算をしても、プログラムの実行速度に違いはありません。

デフォルトの C 配列とまったく同じ速度が必要な場合は、オフセットを配列ポインターに適用できます。

int* a = new int[10];
a = a + 5;
a[-1] = 1;

ただし、お勧めしません。本当にそうしたい場合は、恐ろしいコードを隠すインライン関数を持つラッパー クラスを作成する必要があります。C コードの速度を維持しながら、エラー チェックをさらに追加することができます。

コメントで述べたように、配列ポインターを変更した後、そのポインターを使用して削除することはできません。配列の実際の先頭にリセットする必要があります。別の方法として、ポインターを常に先頭に保持し、別の変更されたポインターで作業することもできます。

//resetting the array by adding the offset (of -5)
delete [] (a - 5);
于 2010-02-22T16:13:25.317 に答える
4

Astd::vector<int>はここでトリックを行います。
ベクトル内の単一要素へのランダム アクセスは O(1) のみです。

カスタム インデックスが本当に必要な場合は、ベクトルに基づいて独自の小さなクラスを作成し、オフセットを適用できます。

于 2010-02-22T16:10:34.657 に答える
2

STLのマップクラスを使用します。

std::map<int, int> a;
for( int index = -5; index < 6; ++index )
{ 
    a[index] = index; 
}

マップは、ソートされたコンテナとして内部的に実装されます。これは、バイナリ検索を使用してアイテムを検索します。

于 2010-02-22T16:08:33.540 に答える
0

私はあまり賢くないので、回答を編集しました。

std::vectorとオフセットをクラスにラップし、以下を提供しoperator[]ます。

template <class T>
class ArbVector
{
    private:
        int _offset;
        std::vector<T> container;
    public:
        ArbVector(int offset) : _offset(offset) {}
        T& operator[](int n) { return container[n + _offset] }
};

これがコンパイルされるかどうかはわかりませんが、アイデアは得られます。

ただし、派生しstd::vectorないでください。コメントを参照してください。

于 2010-02-22T16:20:02.613 に答える