Mehrdimensionaler Vector in einer Klasse
-
Hallo,
ich versuche verzweifelt, in einer Klasse einen 4-dimensionalen std::Vektor
zu erstellen. Mein Code:
physik.cpp:#include <iostream> #include <string> #include <sstream> #include <fstream> #include <vector> using namespace std; class physik { private: //eigentlich wollte ich hier gleich die größe des vectors festlegen: // vector<vector<vector<vector<int> > > > bixel_map(6, vector< vector<vector<int> > > (36, vector<vector<int> >(36,vector<int>(2))) ); //Deswegen erstmal: vector<vector<vector<vector<int> > > > bixel_map; public: void load_ker(char*); };main.cpp:
#include<iostream> #include <string> #include <sstream> #include <fstream> #include <vector> #include "physik.cpp" using namespace std; int main() { char* s3="daten.txt"; physik physik; physik.load_ker(s3); } void physik::load_ker(char* roi){ //hier werden die werte von int b,x,y,anz,start bestimmt //und sollen jetzt in bixel_map gespeichert werden: //b=0..5, x=1..36, y=1..36 bixel_map.reserve(6*36*36*2); //anzahl der möglichen elemente bixel_map[b][x][y][0]=start; bixel_map[b][x][y][1]=start+anz-1; }Dummerweise bekomme ich so immer einen "Segmentation fault".
Wo liegt mein Fehler? Gibt es eine bessere Möglichkeit, die
Dimension von mehrdimensionalen Vectoren innerhalb einer Klasse
festzulegen?Vielen Dank schonmal,
Moritz
-
Erstens mal führt
reserve()nur dazu, dass die Kapazität des Vectors sicher genügend gross ist, um spätere Reallokationen zu vermeiden. Die Elemente werden nicht initialisiert. Vielleicht meinst duresize().Zweitens gibst du als Argument
6*36*36*2an; ich denke nicht, dass das gewollt ist. Die erste Dimension des Vectors soll wahrscheinlich 6, die zweite 36 etc. haben - dann musst du das auch so machen. Also mit verschachtelten For-Schleifen undresize()-Aufrufen. Oder du gibst die Grösse im Konstruktor des Vektors (also Initialisierungsliste des Klassenkonstruktors) an.Aber benötigst du wirklich einen vierdimensionalen Vector? Das kann ziemlich mühsam werden... Meinst du nicht, du könntest gewisse Eigenschaften in eine Klasse zusammenpacken? Ansonsten gibts auch noch Boost.MultiArray, das ist aber so viel ich weiss nicht sehr einfach zu handhaben...
-
Danke für die schnelle Antwort!
Mit den Dimensionen hast du recht.
Was ich brauche ist ein start und stop Wert in Abhängigkeit von b,x und y.
Da erscheint mir der 4-dim Vector als ei.fachste Lösung.
vector[b][x][y][0]=startwert
vector[b][x][y][1]=stopwertWie funktioniert das denn mit den verschachtelten For-Schleifen und resize()?
Zwischenzeitlich hab ich folgendes versucht:
Ich erzeuge den vector direkt mit den richtigen Dimensionen in load_ker:oid physik::load_ker(char* roi){ //hier werden die werte von int b,x,y,anz,start bestimmt //und sollen jetzt in bixel_map gespeichert werden: //b=0..5, x=1..36, y=1..36 vector< vector< vector <vector<int> > > > bixel_map_speicher(6, vector <vector < vector<int> > > (36, vector <vector<int> >(4,vector<int>(2,0))) ); bixel_map_speicher[b][x][y][0]=start; bixel_map_speicher[b][x][y][1]=start+anz-1; }Aber auch dieser Versuch endet mit einem Segmentation Fault.
Hätte das funktioniert, hätte ich versucht, den vector mit
bixel_map=bixel_map_speicher zu kopieren. Aber soweit kam es ja nicht...
-
Also als erstes würde ich mal ein Struct (oder gleich eine Klasse) für den Start- und Stoppwert machen:
struct Value // vielleicht hast du ja einen besseren Namen ;) { int Start; int Stop; Value() : Start(1), Stop(3) {} // für gültige Initialisierung };Lokal würde das so aussehen.
const unsigned int MaxB = 6; const unsigned int MaxX = 36; const unsigned int MaxY = 4; typedef std::vector<std::vector<std::vector<Value> > > Container3D; Container3D Vec(MaxB, std::vector<std::vector<Value> >(MaxX, std::vector<Value>(MaxY, Value())));Aber ich würde das besser gleich in der Initialisierungsliste des Konstruktors erledigen:
physik::physik() : bixel_map(MaxB, std::vector<std::vector<Value> >(MaxX, std::vector<Value>(MaxY, Value())) { }Das
typedefkannst du trotzdem in der Klasse (auf Member-Ebene) deklarieren, um den Typ schnell schreiben zu können.
-
Ah, danke. So werd ichs machen.
Aber nur der Neugier wegen: Wie würde mans jetzt mit dem 4D-Vector machen?
-
mowo(fs) schrieb:
Ah, danke. So werd ichs machen.
Aber nur der Neugier wegen: Wie würde mans jetzt mit dem 4D-Vector machen?
Genau gleich, wie bei 3D, einfach nochmal eine Ebene tiefer..
-
schon klar... aber das hat ja nicht funktioniert...
-
mowo(fs) schrieb:
schon klar... aber das hat ja nicht funktioniert...
Funktioniert nicht gibts nicht..
Zeit mal Code her, wo du das bekommst. Du greifst wahrscheinlich einfach auf ungültigen Bereich zu..
-
Wenn du mein oberes Beispiel verstanden hast, sollte dir auch die Vorgehensweise bei einem vierdimensionalen Vektor klar sein. Ansonsten frag nach, was du noch nicht verstanden hast.