Frage

Haben eine der beliebten C ++ - Bibliotheken eine Klasse (oder Klassen), die es dem Entwickler ermöglicht, Arrays mit willkürlichen Indizes zu verwenden, ohne die Geschwindigkeit zu beeinträchtigen?

Um dieser Frage konkretere Form zu geben, möchte ich die Möglichkeit, Code ähnlich wie unten zu schreiben:

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

Lösung

Wirklich, Sie sollten einen Vektor mit Offset verwenden. Oder sogar ein Array mit einem Offset. Die zusätzliche Ergänzung oder Subtraktion wird keinen Unterschied zur Ausführung der Ausführung des Programms machen.

Wenn Sie etwas mit genau der gleichen Geschwindigkeit wie ein Standard -C -Array wünschen, können Sie den Offset auf den Array -Zeiger anwenden:

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

Es wird jedoch nicht empfohlen. Wenn Sie wirklich dies tun möchten, sollten Sie eine Wrapper -Klasse mit Inline -Funktionen erstellen, die den schrecklichen Code verbirgt. Sie behalten die Geschwindigkeit des C -Codes bei, haben jedoch die Möglichkeit, mehr Fehlerprüfung hinzuzufügen.

Wie in den Kommentaren erwähnt, können Sie nach dem Ändern des Array -Zeigers nicht mit diesem Zeiger löschen. Sie müssen es auf den tatsächlichen Start des Arrays zurücksetzen. Die Alternative ist, dass Sie den Zeiger immer bis zum Start halten, aber mit einem anderen geänderten Zeiger arbeiten.

//resetting the array by adding the offset (of -5)
delete [] (a - 5);

Andere Tipps

EIN std::vector<int> würde hier den Trick machen.
Zufällige Sprecher zu einem einzelnen Element in einem Vektor ist nur O (1).

Wenn Sie wirklich die benutzerdefinierten Indizes benötigen, können Sie Ihre eigene kleine Klasse basierend auf einem Vektor für die Anwendung eines Ofset erstellen.

Verwenden Sie die Kartenklasse aus der STL:

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

MAP wird intern als sortierter Container implementiert, der eine binäre Suche zum Suchen von Elementen verwendet.

Dies ist ein alter Thread, aber als Referenz willen ...

Boost.multiarray hat ein Ausdehnungssystem zum Einstellen eines beliebigen Indexbereichs.

Die Arrays in der Objexxfcl Die Bibliothek unterstützt die beliebigen Indexbereiche voll und ganz.

Dies sind beide mehrdimensionale Array-Bibliotheken. Für das OP 1D -Array sollte die obige Std :: Vektorverpackung ausreichen.

Antwort bearbeitet, weil ich nicht sehr schlau bin.

Wick an std::vector und ein Offset in eine Klasse und liefern eine 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] }
};

Ich bin mir nicht sicher, ob dies kompiliert, aber Sie haben die Idee.

Nicht abgeleitet von std::vector Siehe jedoch Kommentare.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top