Initialisierung von Arrays auf dem heap
Wie kann ich manuell Werte in array auf dem heap?
Wenn das array der lokalen Variablen (stack), es kann getan werden, sehr elegante und einfache Weise, wie diese:
int myArray[3] = {1,2,3};
Leider folgenden code
int * myArray = new int[3];
myArray = {1,2,3};
Ausgänge ein Fehler bei der Zusammenstellung
error: expected primary-expression before ‘{’ token
error: expected `;' before ‘{’ token
Muss ich verwenden, Zyklus, oder nicht-so-viel-elegante Art und Weise, wie diese?
myArray[0] = 1;
myArray[1] = 2;
myArray[2] = 3;
von den blicken von Ihrem Beispiel, Sie wollen zu füllen, array mit Elementen von 0 .. N, mit den Werten 1 .. N + 1. Eine for-Schleife, dies zu tun wäre schön. Was ist Ihre eigentliche Absicht?
InformationsquelleAutor Radek Simko | 2010-12-31
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist interessant: Schieben Sie ein array in einen Vektor
Jedoch, wenn Sie das nicht tun es für Sie, versuchen Sie Folgendes:
std::copy(stack_array, stack_array+5, &array[0]);
VLA (variable length array) ist nicht Teil der C++ - standard
VLAs in C++ also -1
InformationsquelleAutor langerra.com
Können Sie festlegen, Konstanten-array, wie myConstArray[] = {1, 2, 3} und tun memcpy nach new int[3].
Leider ist dies ineffizient, am besten, und unmöglich im schlimmsten Fall (wenn der Typ eine Klasse ohne Kopie/Belegung).
Mit Art, die eine Klasse ohne Kopie/Belegung es unmöglich sein würde, verwenden Sie Konstanten-array an alle.
Aber was, wenn sind Zeiger eines Objekts auf sich selbst?
InformationsquelleAutor Nickolay Olshevsky
{1,2,3}
ist eine sehr eingeschränkte syntax, die speziell für POD-Struktur-Initialisierung (scheinbar C-Stil-array wurde als zu). Die einzige Sache, die Sie tun können, ist, wieint x[] = {1,2,3};
oderint x[3] = {1,2,3};
, aber Sie können nicht tun, wederint x[3]; x={1,2,3};
noch verwenden{1,2,3}
an jedem anderen Ort.Wenn Sie das tun, C++, es ist besser, etwas zu verwenden, wie std::vector anstatt arrays im C-Format, wie Sie die als gefährlich eingestuft sind - zum Beispiel können Sie nicht wissen, Ihre Größe und löschen müssen Sie mit einem
delete[]
, nicht eine normaledelete
. Mit std::vector Sie haben noch immer die gleiche Initialisierung problem, obwohl. Wenn ich solche Initialisierung nicht viel, ich würde wahrscheinlich ein makro erstellen, zuweisen zu einem dummy-lokale variable und dann kopieren Speicher zum Ziel.EDIT: Man könnte auch es so machen (std::vector immer noch vorzuziehen):
aber dann haben Sie, um die Funktion überschreiben mit einer anderen Anzahl von Argumenten oder verwenden va_arg das ist, mal wieder, unsicher.
EDIT2: Meine Antwort ist nur gültig für C++03, wie andere Menschen erwähnt, die C++0x hat einige Verbesserungen an diesem.
InformationsquelleAutor Roman L
C++0x-standard hat die spezielle Art genannt
initializer_list
und die Besondere syntax, die für Sie (Art von Ausdruck{1, 2, 3}
iststd::initializer_list<int>
).std::vector
undstd::array
haben Konstruktoren aus, so können Sie schreibenvector<int> v = {1, 2, 3}
.Es ist keine gute Lösung in C++98/C++03.
InformationsquelleAutor crazylammer
Wenn Sie möchten, dass eine Allgemeine Antwort, das funktioniert für alle Arten, dann, was Sie tun, ist:
malloc() oder operator new() erstellt ein array von uninitialised-Speicher der richtigen Länge, berechnet durch nelts * sizeof(T)
Machen ein array, bestehend aus dem argument für einen Konstruktor für jedes element.
Anwenden der Konstruktor bei der Platzierung, form oder jedes element mit dem entsprechenden argument.
Funktioniert dies nur, wenn der gleiche Konstruktor wird für jedes element. Wenn nicht, müssen Sie eine kompliziertere Datenstruktur und Algorithmus zu wählen, der richtige Konstruktor für jedes element.
Einen Spezialfall dieser ist, verwenden Sie ein array der aktuellen Elemente und verwenden Sie die copy-Konstruktor, und ein besonderer Fall ist, wenn der Typ ein POD, und Sie können einfach memcpy zu konstruieren, die viel auf einmal.
Wenn der Konstruktor benötigt zwei Argumente, die Sie schreiben müssen, eine initiator-Verfahren (wrapper). Zum Beispiel:
und nutzen, statt nur neue(p).
InformationsquelleAutor Yttrill