3 Stimmen

C++-Klasse für Arrays mit beliebigen Indizes

Hat irgendeine der populären C++-Bibliotheken eine Klasse (oder Klassen), die es dem Entwickler erlaubt, Arrays mit beliebigen Indizes zu verwenden, ohne dabei an Geschwindigkeit einzubüßen?

Um diese Frage zu konkretisieren, hätte ich gerne die Möglichkeit, einen ähnlichen Code wie den folgenden 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;
}

6voto

Yacoby Punkte 52756

Eigentlich sollten Sie einen Vektor mit einem Offset verwenden. Oder sogar ein Array mit einem Offset. Die zusätzliche Addition oder Subtraktion wird keinen Unterschied in der Ausführungsgeschwindigkeit des Programms machen.

Wenn Sie etwas mit genau der gleichen Geschwindigkeit wie ein Standard-C-Array wollen, 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 das wirklich tun wollen, sollten Sie eine Wrapper-Klasse mit Inline-Funktionen erstellen, die den schrecklichen Code verbirgt. Sie behalten die Geschwindigkeit des C-Codes bei, haben aber die Möglichkeit, mehr Fehlerprüfungen hinzuzufügen.

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

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

4voto

f4. Punkte 3796

A std::vector<int> würde hier den Zweck erfüllen.
Der zufällige Zugriff auf ein einzelnes Element eines Vektors ist nur O(1).

Wenn Sie die benutzerdefinierten Indizes wirklich benötigen, können Sie Ihre eigene kleine Klasse auf der Grundlage eines Vektors erstellen, um ein ofset anzuwenden.

2voto

Jon Benedicto Punkte 10364

Verwenden Sie die Kartenklasse aus der STL:

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

map ist intern als sortierter Container implementiert, der eine binäre Suche verwendet, um Elemente zu finden.

1voto

fjorder Punkte 21

[Dies ist ein altes Thema, aber als Referenz...]

Boost.MultiArray verfügt über ein Ausdehnungssystem, mit dem jeder Indexbereich festgelegt werden kann.

Die Arrays in der Datei ObjexxFCL Bibliothek haben volle Unterstützung für beliebige Indexbereiche.

Dies sind beides mehrdimensionale Array-Bibliotheken. Für die OP 1D Array braucht die std::vector Wrapper oben sollte ausreichen.

0voto

suszterpatt Punkte 8097

Antwort bearbeitet, weil ich nicht sehr klug bin.

Einwickeln std::vector und einen Offset in eine Klasse einfügen und 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 nicht sicher, ob sich das kompilieren lässt, aber Sie haben die Idee.

NICHT ableiten von std::vector siehe jedoch die Kommentare.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X