Doppeltes (zweidimensionales) Array mit std :: unique_ptr

8

Ich habe ein doppeltes Array, das vom Zeiger auf den Zeiger zugewiesen wird.

%Vor%

Ich versuche dies mit unique_ptr :

zu tun %Vor%

, aber es wurde immer ein Fehler angezeigt, der besagt, dass no operator = matches these operands . Was mache ich hier falsch?

    
Evan 20.03.2012, 20:19
quelle

6 Antworten

15

Sie können keinem int* eine std::unique_ptr<int[]> zuweisen, das ist die Ursache für Ihren Fehler. Der richtige Code ist

%Vor%

Allerdings ist piokuc korrekt, dass es sehr ungewöhnlich ist, unique_ptr für Arrays zu verwenden, denn std::vector und std::array sind dafür gedacht, abhängig davon, ob die Größe im Voraus bekannt ist.

%Vor%

All diese können genauso wie der Code, den Sie bereits hatten, initialisiert und verwendet werden, außer dass sie einfacher zu konstruieren sind und Sie sie nicht zerstören müssen.

    
Mooing Duck 20.03.2012 23:11
quelle
4

Wenn Sie nicht den Luxus haben, ein std::array oder ein std::vector anstelle eines dynamisch zugewiesenen Arrays zu verwenden, können Sie ein unique_ptr für ein zweidimensionales Array in C ++ 11 wie folgt verwenden:

%Vor%

Die Deklaration unique_ptr sorgt dafür, dass die Dimension Zeile des Arrays zugewiesen wird. Das abschließende () in new int*[10]() stellt sicher, dass jeder Spaltenzeiger auf nullptr initialisiert wird.

Eine for-Schleife weist dann die Spalten-Arrays zu:

%Vor%

Wenn der unique_ptr den Gültigkeitsbereich verlässt, sorgt seine benutzerdefinierte Lösch-Lambda-Funktion dafür, dass die Spalten-Arrays gelöscht werden, bevor das Zeilen-Array gelöscht wird. Der for_each Ausdruck verwendet den default_delete Funktor.

    
sakra 23.02.2015 20:21
quelle
2

Ihr Code manipuliert effektiv ein Array von Arrays mit int.

In C ++ möchten Sie es normalerweise wie folgt implementieren:

%Vor%

Dies ist kein guter Fall für unique_ptr. Außerdem sollten Sie keine Zeiger auf unique_ptr verwenden und unique_ptr-Objekte dynamisch zuweisen. Der einzige Punkt von unique_ptr ist die Eliminierung der Verwendung von Zeigern und die automatische Zuweisung und Freigabe von Objekten.

    
piokuc 20.03.2012 20:24
quelle
2
%Vor%

NEIN NEIN NEIN NEIN

%Vor%

// yo

    
amigo 20.03.2012 23:38
quelle
1

Die einzigen Gründe, warum ich denken kann, std :: unique_ptr (oder sagen boost :: scoped_array) über std :: vector zum Halten von Arrays zu verwenden, sind normalerweise nicht anwendbar ...

1) Es speichert 1 oder 2 Zeiger im Wert von Speicher, abhängig davon, ob Sie wissen, wie groß die Größe aller Arrays ist [irrelevant, es sei denn, Sie haben eine massive Anzahl sehr kleiner Arrays]

2) Für den Fall, dass Sie das Array nur in eine Funktion übergeben, die ein C-Stil-Array oder einen rohen Zeiger erwartet, könnte es sich als natürlicher anfühlen. std :: vector ist jedoch garantiert sequentiell gespeichert, also ist es auch 100% ig, (a.empty() ? nullptr : &a[0], a.size()) in eine solche Funktion zu übergeben.

3) Standardcontainer im MSVC-Debug-Modus sind standardmäßig "aktiviert" und sehr langsam, was beim wissenschaftlichen Programmieren auf großen Datensätzen ärgerlich sein kann.

    
yonil 25.02.2013 01:12
quelle
0

Ein Beispiel weiter oben inspirierte mich für diese Lösung

%Vor%

Hier können alle Dimensionen dynamisch sein und Sie können sie in eine Klasse einfügen und einen Operator [] anzeigen. Außerdem wird der Speicher zusammenhängend zugeordnet und Sie können leicht einen Zuordner eingeben, der ausgerichteten Speicher zuordnet.

    
Jens Munk 13.10.2016 18:28
quelle

Tags und Links