Tabelle erzeugen
-
hi,
wie kann ich eine tabelle erzeugen in deren spalten sich der jeweilige datentyp unterscheiden soll, d.h. Spalte1 = int, Spalte2 = double, Spalte3 = char, Spalte4 = int, usw. ?
ich dachte daran die tabelle aus einer liste von zeigern auf die felder aufzubauen, die wiederrum jeweils eine liste von elemente für die zellen haben.
die einzelnen felder werden beim einlesen eine textdatei dann dynamisch mit ihrem jeweiligen typ angelegt und als zeiger vom type integer in die liste der felder eingetragen.hier ein beispiel (unvollständig)
class Tabelle { protected: // hier auch verkettete liste/vektor oder ähnliches möglich int **Felder; // dynamisch liste von zeigern public: void Add(void *Feld) {} // Feld (Spalte) einfügen Tabelle() { Felder = new int *[XXX]; } ~Tabelle() { Feld<int> *Feld; for (int i = 0; i < XXX; ++i) { Feld = (Feld<int>*) Felder[i]; Felder[i] = 0; delete Feld; } delete [] Felder; } }; template <typename T> class Feld { protected: T *Daten; // dynamische liste von datenfeldern public: Feld() { Daten = new T[XXX]; } ~Feld() { delete [] Daten; } }; Tabelle T1; Feld<int> *F1 = new Feld<int>; Feld<double> *F2 = new Feld<double>; T1.Add(F1); T1.Add(F2);
ziel ist es, die einzelnen spalten möglichst schnell sortieren/löschen/einfügen/vertauschen zu können.
eine union möchte ich nicht verwenden, da mir dort der overhead für die sortierung nach einem entsprechenden datenwert zu gross erscheint bzw. ja dort auch mehr speicher verwendet wird, als nötig (immer soviel wie der grösste typ der union) oder liege ich da falsch?
gibt es vielleicht einen anderen ansatz der sich dafür besser eignet?
desweitern weiss ich auch nicht, ob im destruktor von Tabelle der cast nach Feld<int> genügt um den speicher für wirklich jeden datentyp freizugeben (vorallem wenn der datentyp z.b. double wäre). zumindest in meiner testversion kommt keinerlei speicherleck zu tage.
-
Mach den Destuktor ~Feld() virtuel und du kannst dir den Cast schenken.
Bist du dir sicher, dass du die Daten wirklich spaltenweise verarbeiten möchtest? Ist nicht sehr performant wenn du nachher die Daten zeilenweise be/verarbeiten willst...