Unten ist eine einfache Möglichkeit zum Erstellen von 3D-Arrays mit C oder C++ in einem Stück Speicher für jedes Array. Es ist nicht nötig BOOST zu verwenden (auch wenn es nett ist), oder die Aufteilung zwischen Zeilen mit mehrfacher Indirection zu teilen (das ist ziemlich schlecht, da es normalerweise eine große Leistungseinbuße beim Zugriff auf Daten bedeutet und den Speicher fragmentiert).
Das einzige, was zu verstehen ist, dass es keine mehrdimensionalen Arrays gibt, nur Arrays von Arrays (von Arrays). Der innerste Index ist der am weitesten im Speicher.
#include <stdio.h>
#include <stdlib.h>
int main(){
{
// C Style Static 3D Arrays
int a[10][20][30];
a[9][19][29] = 10;
printf("a[9][19][29]=%d\n", a[9][19][29]);
}
{
// C Style dynamic 3D Arrays
int (*a)[20][30];
a = (int (*)[20][30])malloc(10*20*30*sizeof(int));
a[9][19][29] = 10;
printf("a[9][19][29]=%d\n", a[9][19][29]);
free(a);
}
{
// C++ Style dynamic 3D Arrays
int (*a)[20][30];
a = new int[10][20][30];
a[9][19][29] = 10;
printf("a[9][19][29]=%d\n", a[9][19][29]);
delete [] a;
}
}
Für Ihre eigentliche Problem, als potentiell zwei unbekannte Dimensionen ist, gibt es ein Problem mit meinem Vorschlag es nur eine unbekannte Dimension ermöglichen. Es gibt mehrere Möglichkeiten, dies zu verwalten.
Die gute Nachricht ist, dass die Verwendung von Variablen jetzt mit C funktioniert, es heißt Arrays variabler Länge. Sie sehen here für Details.
int x = 100;
int y = 200;
int z = 30;
{
// C Style Static 3D Arrays
int a[x][y][z];
a[99][199][29] = 10;
printf("a[99][199][29]=%d\n", a[99][199][29]);
}
{
// C Style dynamic 3D Arrays
int (*a)[y][z];
a = (int (*)[y][z])malloc(x*y*z*sizeof(int));
a[99][199][29] = 10;
printf("a[99][199][29]=%d\n", a[99][199][29]);
free(a);
}
Wenn C++ Der einfachste Weg ist wahrscheinlich Operator zu verwenden Überlastung mit Array-Syntax bleiben:
{
class ThreeDArray {
class InnerTwoDArray {
int * data;
size_t y;
size_t z;
public:
InnerTwoDArray(int * data, size_t y, size_t z)
: data(data), y(y), z(z) {}
public:
int * operator [](size_t y){ return data + y*z; }
};
int * data;
size_t x;
size_t y;
size_t z;
public:
ThreeDArray(size_t x, size_t y, size_t z) : x(x), y(y), z(z) {
data = (int*)malloc(x*y*z*sizeof data);
}
~ThreeDArray(){ free(data); }
InnerTwoDArray operator [](size_t x){
return InnerTwoDArray(data + x*y*z, y, z);
}
};
ThreeDArray a(x, y, z);
a[99][199][29] = 10;
printf("a[99][199][29]=%d\n", a[99][199][29]);
}
Der obige Code hat einige indirection Kosten für InnerTwoDArray Zugriff (aber ein guter Compiler kann wahrscheinlich optimieren weg), verwendet jedoch nur einen Speicherblock für das Array, das auf dem Heap zugeordnet ist. Welches ist normalerweise die effizienteste Wahl.
Offensichtlich, auch wenn der obige Code immer noch einfach und unkompliziert ist, macht STL oder BOOST es gut, daher muss das Rad nicht neu erfunden werden. Ich glaube immer noch, dass es interessant ist zu wissen, dass es leicht gemacht werden kann.
Alte Knochen knacken, ich weiß ... aber warum benutzen Leute C++, wenn "grundlegende" Dinge wie multidimensionale Arrays gratis mit anderen höheren Sprachen kommen? Ist es etwas, dass Sie C++ benutzen müssen, damit Ihre Hände hinter Ihrem Rücken gefesselt sind? Performance? – MikeMurko
Hallo MikeMurko, zu dieser Zeit die Hände gebundene Grund wäre die korrekteste. Ich wäre genauso glücklich, etwas in Java oder C# zu machen. – AndyUK