643 Stimmen

Wie deklariere ich ein 2d-Array in C++ mit new?

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.

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

0voto

mathengineer Punkte 110

Ich habe dieses nicht elegante, aber SCHNELLE, EINFACHE und FUNKTIONIERENDE System verwendet. Ich sehe nicht, warum kann nicht funktionieren, weil der einzige Weg für das System zu ermöglichen, erstellen Sie eine große Größe Array und Zugriff Teile ist ohne Schneiden es in Teile:

#define DIM 3
#define WORMS 50000 //gusanos

void halla_centros_V000(double CENW[][DIM])
{
    CENW[i][j]=...
    ...
}

int main()
{
    double *CENW_MEM=new double[WORMS*DIM];
    double (*CENW)[DIM];
    CENW=(double (*)[3]) &CENW_MEM[0];
    halla_centros_V000(CENW);
    delete[] CENW_MEM;
}

0voto

Beginnen Sie mit der Definition des Arrays mit Zeigern (Zeile 1):

int** a = new int* [x];     //x is the number of rows
for(int i = 0; i < x; i++)
    a[i] = new int[y];     //y is the number of columns

0voto

FedeBsAs Punkte 19

Ich habe Ihnen eine Lösung hinterlassen, die für mich in bestimmten Fällen am besten funktioniert. Vor allem, wenn man die Größe einer Dimension des Arrays kennt. Sehr nützlich für ein Array von chars, zum Beispiel, wenn wir ein Array von unterschiedlicher Größe von Arrays von char[20] benötigen.

int  size = 1492;
char (*array)[20];

array = new char[size][20];
...
strcpy(array[5], "hola!");
...
delete [] array;

Der Schlüssel sind die Klammern in der Array-Deklaration.

0voto

Emad Ahmed Punkte 441

Wenn Sie ein vordefiniertes Zeigerarray deklarieren wollen:

int **x;
x = new int*[2] { 
        new int[2] { 0, 1 },
        new int[2] { 2, 3 } 
    };

Zugang:

cout << x[0][0];

0voto

Simon Smith Punkte 151

Wenn Sie das Array nur lokal oder innerhalb einer Klasse verwenden, können Sie einen Lambda-Ausdruck verwenden, um ein Array-ähnliches Objekt zu erstellen.

int main(int argc, char **argv) {
  srand(time(0));
  int w = rand() % 20 + 10;
  int h = rand() % 20 + 10;
  {
    // Here. Only one line and no memory leak.
    auto arr = [=, p = std::make_unique<int[]>(w * h)](int i, int j) -> int & { return *&p[i * w + j]; };
    arr(1, 0) = 6;
    std::cout << arr(1, 0) << '\n';
  }
}

Das Objekt ist nicht kompatibel mit int[][] und um es als Argument zu übergeben, benötigen Sie Vorlagen. Aber es kann Sie von der Mühe befreien, sich [i * w + j] rechts, wenn Sie auf ein Element zugreifen.

Sie können auch eine bloße std::unique_ptr<int[]> zusammen mit einem in Lambda implementierten Getter. Aber Sie können Fehler machen und baumelnde Referenzen haben.

CodeJaeger.com

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.

Powered by:

X