Iteration durch Objekte mit einer gemeinsamen Basisklasse im gemeinsamen Speicher

8

Ich versuche herauszufinden, wie ich einen Container (wie std :: vector) von Objekten durchlaufen kann, die eine gemeinsame Basis-Elternklasse zusammenhängend im Speicher haben.

Um das Problem zu demonstrieren, verwenden wir die folgenden Beispiele.

%Vor%

Wenn wir nun std :: vector verwenden, um zu iterieren, würden die Objekte im zusammenhängenden Speicher bleiben, aber wir würden schneiden, da für die abgeleiteten Eigenschaften kein Platz ist.

Also müssen wir die polymorphe Technik benutzen, indem wir Zeiger wie diese verwenden

%Vor%

Soweit ich weiß, sollte das gut funktionieren, da die Klassen implementiert sind.

Problem: Jetzt enthält der Vektor Zeiger im zusammenhängenden Speicher, aber das bedeutet nicht, dass die Adressen, auf die sie zeigen, sind.

Wenn ich also jederzeit Objekte in den Vektor löschen und einfügen kann, werden die Objekte überall im Speicher verteilt.

Frage: Es scheint, als ob jeder vorschlägt, es auf die Art std :: vector zu tun, aber warum wird es nicht als problematisch angesehen, dass es nicht zusammenhängend im Speicher iterierbar ist (vorausgesetzt, wir verwenden den Zeiger tatsächlich)?

Muss ich es auf Copy-Pasta-Art machen?

%Vor%

Ich vermute, dass es keine wirkliche Lösung dafür geben kann, da Objekte unterschiedlicher Größe linear im Speicher zu halten, keinen Sinn ergibt, aber wenn mir jemand einen Rat geben kann, würde ich das schätzen.

    
jezzi23 27.06.2015, 23:45
quelle

2 Antworten

-3

std::vector<T> iterators nehmen an, dass die Objekte im zusammenhängenden Speicher vom Typ T sind, std::vector<T>::iterator::operator++ berücksichtigt sizeof T als invariant - dh, es wird die spezifische Instanz für die Größe nicht konsultiert.

Im Prinzip können Sie sich vector und vector::iterator als dünne Fassade über einem T* m_data Zeiger vorstellen, so dass iterator++ eigentlich nur eine einfache Zeigeroperation ist.

Sie müssen wahrscheinlich einen benutzerdefinierten Zuordner und direkt an Ort und Stelle new verwenden, um Ihre Daten vorzubereiten, begleitet von Indizierung, Verlinkung usw. Betrachten Sie vielleicht etwas wie Ссылка

Siehe auch boost :: stable_vector

    
kfsone 28.06.2015 00:31
quelle
-3

std::vector weist die Objekte im fortlaufenden Speicher zu, aber die Objektzeiger, die Sie im Vektor speichern, nicht. So durchlaufen Sie vector . Der folgende Code ist in C ++ 14 geschrieben. Das beschriebene Problem ist durch diese Lösung nicht lösbar, da die Objektzeiger im fortlaufenden Speicher, nicht aber den eigentlichen Objekten gespeichert sind.

%Vor%

Live-Demo hier .

    
Mital Vora 28.06.2015 02:26
quelle

Tags und Links