Wie deklariere ich ein 2d-Array mit new?
Bei einer "normalen" Anordnung würde ich das tun:
int* ary = new int[Size]
mais
int** ary = new int[sizeY][sizeX]
a) nicht funktioniert/kompiliert und b) nichts bewirkt:
int ary[sizeY][sizeX]
tut.
Wie deklariere ich ein 2d-Array mit new?
Bei einer "normalen" Anordnung würde ich das tun:
int* ary = new int[Size]
mais
int** ary = new int[sizeY][sizeX]
a) nicht funktioniert/kompiliert und b) nichts bewirkt:
int ary[sizeY][sizeX]
tut.
Das nachstehende Beispiel könnte hilfreich sein,
int main(void)
{
double **a2d = new double*[5];
/* initializing Number of rows, in this case 5 rows) */
for (int i = 0; i < 5; i++)
{
a2d[i] = new double[3]; /* initializing Number of columns, in this case 3 columns */
}
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 3; j++)
{
a2d[i][j] = 1; /* Assigning value 1 to all elements */
}
}
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 3; j++)
{
cout << a2d[i][j] << endl; /* Printing all elements to verify all elements have been correctly assigned or not */
}
}
for (int i = 0; i < 5; i++)
delete[] a2d[i];
delete[] a2d;
return 0;
}
Wenn Ihr Projekt CLI (Common Language Runtime Support) ist , dann:
Sie können die Array-Klasse verwenden, nicht die Klasse, die Sie beim Schreiben erhalten:
#include <array>
using namespace std;
Mit anderen Worten, nicht die nicht verwaltete Array-Klasse, die Sie erhalten, wenn Sie den std-Namespace verwenden und den Array-Header einbeziehen, nicht die nicht verwaltete Array-Klasse, die im std-Namespace und im Array-Header definiert ist, sondern die verwaltete Array-Klasse der CLI.
Mit dieser Klasse können Sie ein Array mit beliebigen Rang Sie wollen.
Der folgende Code erstellt ein neues zweidimensionales Array mit 2 Zeilen und 3 Spalten vom Typ int, das ich "arr" nenne:
array<int, 2>^ arr = gcnew array<int, 2>(2, 3);
Jetzt können Sie auf Elemente im Array zugreifen, indem Sie es benennen und schreiben nur einer eckige Klammern []
und fügen Sie darin die Zeile und die Spalte ein und trennen Sie sie durch ein Komma ,
.
Der folgende Code greift auf ein Element in der 2. Zeile und 1. Spalte des Arrays zu, das ich bereits im vorherigen Code erstellt habe:
arr[0, 1]
Wenn Sie nur diese Zeile schreiben, lesen Sie den Wert in dieser Zelle, d. h. Sie erhalten den Wert in dieser Zelle, aber wenn Sie das Gleichheitszeichen =
Zeichen, sind Sie dabei, den Wert in diese Zelle zu schreiben, d. h. den Wert in dieser Zelle zu setzen. Sie können die Operatoren +=, -=, *= und /= natürlich auch nur für Zahlen verwenden (int, float, double, __int16, __int32, __int64 usw.), aber das wissen Sie sicher schon.
Wenn Ihr Projekt nicht CLI, dann können Sie die nicht verwaltete Array-Klasse aus dem std-Namensraum verwenden, wenn Sie #include <array>
Das Problem ist jedoch, dass sich diese Array-Klasse von dem CLI-Array unterscheidet. Das Erstellen eines Arrays dieses Typs ist dasselbe wie bei CLI, außer dass Sie das ^
Zeichen und das gcnew
Stichwort. Aber leider ist der zweite int-Parameter in der <>
Klammern gibt die Länge (d. h. Größe) des Arrays, nicht seinen Rang!
Es gibt keine Möglichkeit, Rang in dieser Art von Array zu spezifizieren, Rang ist eine Funktion von CLI-Arrays nur. .
std array verhält sich wie ein normales Array in C++, das man mit einem Zeiger definiert, zum Beispiel int*
und dann: new int[size]
, oder ohne Zeiger: int arr[size]
aber im Gegensatz zum normalen Array von C++, bietet std array Funktionen, die Sie mit den Elementen des Arrays verwenden können, wie fill, begin, end, size, etc, aber normal array bietet nichts .
Aber immer noch std Array sind eindimensionale Arrays, wie die normalen C++-Arrays. Aber dank der Lösungen, die die anderen Jungs vorschlagen, wie man das normale eindimensionale C++-Array in ein zweidimensionales Array umwandeln kann, können wir dieselben Ideen an std-Arrays anpassen, z. B. können wir nach Mehrdad Afsharis Idee den folgenden Code schreiben:
array<array<int, 3>, 2> array2d = array<array<int, 3>, 2>();
Diese Codezeile erzeugt eine "jugged array" ist ein eindimensionales Array, bei dem jede seiner Zellen ein anderes eindimensionales Array ist oder auf ein solches zeigt.
Wenn alle eindimensionalen Arrays in einem eindimensionalen Array in ihrer Länge/Größe gleich sind, dann können Sie die array2d-Variable als echtes zweidimensionales Array behandeln, und Sie können die speziellen Methoden verwenden, um Zeilen oder Spalten zu behandeln, je nachdem, wie Sie es im Sinn haben, im 2D-Array, das std array unterstützt.
Sie können auch die Lösung von Kevin Loney verwenden:
int *ary = new int[sizeX*sizeY];
// ary[i][j] is then rewritten as
ary[i*sizeY+j]
aber wenn Sie std array verwenden, muss der Code anders aussehen:
array<int, sizeX*sizeY> ary = array<int, sizeX*sizeY>();
ary.at(i*sizeY+j);
Und haben trotzdem die einzigartigen Funktionen des Standard-Arrays.
Beachten Sie, dass Sie immer noch auf die Elemente des std-Arrays zugreifen können, indem Sie die []
Klammern, und Sie müssen nicht die at
Funktion. Sie können auch eine neue int-Variable definieren und zuweisen, die die Gesamtzahl der Elemente im std-Array berechnet und speichert und deren Wert verwendet, anstatt die Funktion zu wiederholen sizeX*sizeY
Sie können Ihre eigene generische Klasse für ein zweidimensionales Array definieren und den Konstruktor der Klasse für ein zweidimensionales Array so definieren, dass er zwei Integerwerte empfängt, um die Anzahl der Zeilen und Spalten im neuen zweidimensionalen Array anzugeben, und eine get-Funktion definieren, die zwei Integerparameter empfängt, die auf ein Element im zweidimensionalen Array zugreift und seinen Wert zurückgibt, und eine set-Funktion, die drei Parameter empfängt, wobei die ersten beiden Integerwerte sind, die die Zeile und Spalte im zweidimensionalen Array angeben, und der dritte Parameter der neue Wert des Elements ist. Ihr Typ hängt von dem Typ ab, den Sie in der generischen Klasse gewählt haben.
All dies können Sie mit Hilfe von entweder das normale C++-Array (mit oder ohne Zeiger) oder die std Array und verwenden Sie eine der Ideen, die andere Leute vorgeschlagen, und machen Sie es einfach zu verwenden, wie die cli Array, oder wie die zweidimensionale Array, die Sie definieren, zuweisen und in C # verwenden können.
Wenn Sie ein 2d-Array von Ganzzahlen wollen, dessen Elemente sequentiell im Speicher zugewiesen werden, müssen Sie es wie folgt deklarieren
int (*intPtr)[n] = new int[x][n]
wobei anstelle von x können Sie jede beliebige Dimension schreiben, aber n muss an zwei Stellen identisch sein. Beispiel
int (*intPtr)[8] = new int[75][8];
intPtr[5][5] = 6;
cout<<intPtr[0][45]<<endl;
muss drucken 6.
Ich weiß nicht genau, ob die folgende Antwort nicht gegeben wurde aber ich habe beschlossen, einige lokale Optimierungen bei der Zuweisung von 2d-Arrays vorzunehmen (z.B. wird eine quadratische Matrix durch nur eine Zuweisung erledigt): int** mat = new int*[n]; mat[0] = new int [n * n];
Die Löschung erfolgt jedoch aufgrund der Linearität der obigen Zuordnung wie folgt: delete [] mat[0]; delete [] mat;
Dies ist eine alte Antwort, aber ich mag es, dynamische Arrays wie diese für C++ zu deklarieren
int sizeY,sizeX = 10;
//declaring dynamic 2d array:
int **ary = new int*[sizeY];
for (int i = 0; i < sizeY; i++)
{
ary[i] = new int[sizeX];
}
können Sie die Größe während der Laufzeit wie folgt ändern. dies wurde in C++ 98 getestet
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.
74 Stimmen
Es funktioniert nur, wenn sizeX konstant ist: int(*ary)[sizeX] = new int[sizeY][sizeX]; Das ist der richtige Weg, um einen int[sizeY][sizeX] zu erstellen, bei dem der gesamte Speicher zusammenhängend ist. (Ich glaube nicht, dass dies eine Antwort wert ist, da wahrscheinlich Ihre sizeX nicht konstant ist
36 Stimmen
Ich kann nicht glauben, dass all die Dutzende von Antworten unten sind todos falsch und beantwortet die Frage nicht, und dennoch werden sie alle hochgestuft. Der obige Kommentar von Johanes Shaub ist die einzig richtige Antwort auf die Frage . Ein 2D-Array und ein Array mit Zeigern auf ein Array sind zwei völlig verschiedene Dinge, die offenbar jeder verwechselt.
8 Stimmen
@JohannesSchaub-litb: Das ist nicht 100%ig richtig. Sicherlich funktioniert es in diesem Fall, aber es gibt eine Methode, mit der es funktioniert, wenn alle Dimensionen variieren, siehe stackoverflow.com/a/29375830/103167