質問
人気のある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;
}
解決
本当に、オフセットを備えたベクトルを使用する必要があります。またはオフセット付きの配列でさえ。追加の追加または減算は、プログラムの実行速度に違いをもたらすことはありません。
デフォルトの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);
他のヒント
a std::vector<int>
ここでトリックをするでしょう。
ベクトル内の単一要素へのランダムアクセスは、o(1)のみです。
本当にカスタムインデックスが必要な場合は、ベクトルに基づいて独自の小さなクラスを作成してOFSETを適用できます。
STLのマップクラスを使用します。
std::map<int, int> a;
for( int index = -5; index < 6; ++index )
{
a[index] = index;
}
マップは、バイナリ検索を使用してアイテムを見つけるソート付きコンテナとして内部的に実装されます。
これは古いスレッドですが、参照のために...
boost.multiarray 任意のインデックス範囲を設定するための拡張システムがあります。
の配列 objexxfcl ライブラリは、任意のインデックス範囲を完全にサポートしています。
これらはどちらも多次元配列ライブラリです。 OP 1D配列には、上記のSTD :: Vectorラッパーで十分です。
私はあまり賢くないので編集された回答。
ラップan 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
ただし、コメントを参照してください。