Wrap bestehenden Speicher mit const std :: vector?

9

OK, also habe ich kürzlich gelernt, dass (a) std :: vector durch Definition / Standard zusammenhängenden Speicher verwendet und somit (b) & amp; (v [0]) die Adresse des zusammenhängenden Speicherblocks ist, den Sie kann lesen / schreiben als ein alt-skool C-Array. Wie ...

%Vor%

OK, das ist cool, aber ich möchte in die andere Richtung gehen. Ich habe sehr viel vorhandenen Code wie

%Vor%

Wenn ich ein C-Array von Objekten habe, kann ich solchen Code wie folgt verwenden:

%Vor%

Ich möchte das (a) ohne den zusätzlichen Platz und (b) ohne die zusätzliche Zeit tun, eine redundante Kopie all dieser Daten in den Vektor einzufügen. Beachten Sie, dass "nur ändern Sie Ihre dummen computeSomething, Idiot" nicht ausreicht, denn es gibt Tausende solcher Funktionen / Methoden, die dieses Muster zeigen, die nicht unter meiner Kontrolle sind, und selbst wenn sie zu viele waren, um sie alle zu ändern .

Beachten Sie auch, dass ich mich nur für const std :: vector & amp interessiert; Deutsch:. Englisch: www.mjfriendship.de/en/index.php?op...39&Itemid=32 Es gibt keine Sorge, dass mein ursprünglicher Speicher jemals in der Größe verändert oder geändert werden muss. Ich würde etwas wie einen const std :: vector Konstruktor haben wollen, aber ich weiß nicht, ob die Sprache sogar spezielle Konstruktoren für konstante Instanzen einer Klasse erlaubt, wie:

%Vor%

Wenn das nicht möglich ist, wie wäre es mit einem Container, der von std :: vector abgeleitet wurde und std :: const_vector genannt wird, der (a) aus einem Zeiger auf ein c-Array und eine Größe konstruieren konnte und (b) absichtlich getan hat nicht implementieren nicht-const-Methoden (push_back, resize, etc.), so dass selbst dann, wenn das Objekt mit einem Typnamen von const_vector nicht eigentlich ein const-Objekt ist, die Schnittstelle, die nur const-Methoden anbietet, es praktisch const macht (und alle irrtümlichen Versuche, Modify würde zur Kompilierzeit abgefangen werden)?

UPDATE: Ein kleines Durcheinander zeigt, dass dies mein Problem mit der Windows-Implementierung von std :: vector:

"löst" %Vor%

Aber natürlich ist "Lösung" scheußlich, weil (a) es keinen Schutz gegen die Basisklasse bietet, die den ursprünglichen Speicher durch eine resize () oder push_back () löscht (außer für einen sorgfältigen Benutzer, der nur const vector_tweaker ( )) - und (b) es ist spezifisch für eine bestimmte Implementierung von std :: vector und müsste für andere neu implementiert werden - wenn andere Plattformen ihre std :: vector member data nur als protected deklarieren: so wie Microsoft (scheint eine schlechte Idee).

    
RubeRad 24.03.2014, 22:37
quelle

1 Antwort

1

Sie können das in C ++ 11 eingeführte Referenzlogik-Speichern mit std::reference_wrapper<> :

versuchen %Vor%

Oder ohne C11 können Sie eine Spezialisierung einer solchen Template-Klasse für bytes - char erstellen. Dann können Sie für den Konstruktor aus char* C-array ::memcpy verwenden, was dann leider doppelt so viel Speicher belegt.

%Vor%

In etwa so:

%Vor%

Was ich empfehlen würde - Ersetzen Sie alle C-Arrays nach Möglichkeit durch Vektoren, dann wird kein zusätzliches Kopieren mehr benötigt.

    
Alexey Voytenko 24.03.2014 23:01
quelle

Tags und Links