Wie deklariere ich das "zweidimensinale-char-vector-array" in der Klassendefinition?
Was ist ein "char-vector-array"?
Ich habe ein paar Fragen im Zusammenhang mit multidimensinalen Arrays und dem Vector-Template.
Punkt 1: Ein Array ist eine Stück Speicher der so groß ist, dass so viele Elemente des Datentyps reinpassen wie dein Array groß ist:
Code: Alles auswählen
char array1[10]; //10 Byte speicher
int array2[10]; //40 Byte speicher, meistens
Ein vektor ist eine Datenstruktur zur dynamischen Verwaltung von Daten, es entspricht einer Liste.
Du kannst dynamisch Daten hinzu fügen und entfernen, das geht mit einem Array nicht.
Code: Alles auswählen
int max_Xsize, max_Ysize;
char field[max_Xsize][max_Ysize];
Das wird so nicht Funktionieren, zumindest ist mir nicht bekannt das C++ inzwischen dynamische Arrays erlaubt. Das erzeugen eines Arrays auf diese Art erfordert eine feste Größe des Arrays zur Compilierzeit. Willst du dynamisch Arrays erzeugen, musst du Speicher anfordern:
Code: Alles auswählen
char * dynamicArray = new char[sizeX * sizeY];
char *dynamicArray2 = (char*)malloc(count * sizeof(char));
und diesen wieder Freigeben, wenn er nicht mehr benötigt wird.
Eine lokal in einer Funktion angelegte Variable ist auch nur in diesem Scope gültig, deine Variable "field" in deinem Konstruktor:
Code: Alles auswählen
Field::Field()
{
//...
vector< vector<char> > field(max_Xsize);
for( int i =0; i <= max_Xsize; i++){
field[i].resize(max_Ysize);
}
//...
}
Hat damit keinen Einfluss auf das Klassenmemeber "field", was übrigens einen anderen Datentyp hat.
Wenn deine Klasse einfach nur ein zweidimensionales Array handeln soll, dass sich nach dem Anlegen nicht mehr ändert würde ich die Verwendung eines dynamischen Arrays raten:
Damit hast du ein stück Speicher auf den man schnell und einfach zugreifen kann und den man auch am Stück wieder freigibt.
Willst du eine Liste an arrays bauen würde ich folgendes nutzen:
Code: Alles auswählen
struct element
{
int length;
char * data;
};
[...]
vector<struct element> data;
So kannst du für jedes char Array ein stück Speicher reservieren über den man schnell Iterieren kann, hat aber trotzdem die Möglichkeit für jede Zeile eine andere länge zu verwenden.
Ich würde die Verwaltung von chars in einem vector nicht empfehlen. Char ist auf den meisten Systemen 1 byte groß, zur Verwaltung der Daten muss ein vector mindestens 4 byte Daten anlegen(Pointer auf das Element), was bedeutet, dass du für jedes Zeichen mindestens einen 4-fachen Overhead erzeugst.
Redundanz macht wiederholen unnötig.
quod erat expectandum