Welchen Containertyp?
-
Hi,
ich habe folgende Problemstellung: in einem dreidimensionalen Array werden an bestimmten Positionen ein oder zwei Werte abgelegt. Danach muss ich nachschauen können, ob an einer bestimmten Position im Array Werte abgelegt sind, und falls ja, welche Werte. Im Moment habe ich es folgendermaßen realisiert:
int ****array
array=new int ***[sizex+1];
for (x=0;x<sizex+1;x++)
{
array[x]=new int **[sizey+1];
for(y=0;y<sizey+1;y++)
{
array[x][y]=new int *[sizez+1];
for(z=0;z<sizez+1;z++)
{
voxels[x][y][z]=new int[2];
}
}
}
Das ist aber ne ziemliche Speicherverschwendung, weil nur sehr wenige Werte tatsächlich belegt werden. Vektoren kommen nicht in Frage, weil ich direkt über die Koordinaten, also z.b. [3;5;6] die Werte abfragen können muss. Eine Map wäre dafür wahrscheinlich ganz gut geeignet, aber da gibt es folgende Probleme:
1. Wie übergebe ich als Schlüssel drei Werte
2. Wenn ich auf ein nicht belegten Schlüssel zugreife, erstellt die Map an der Position automatisch ein Schlüssel-Wertepaar, ohne das es benötigt wird.Ich hoffe ich hab das Problem einigermaßen darstellen können
Danke für eure Hilfe
Steve
-
du könntest evtl
int ****array array=new int ***[sizex+1]; for (x=0;x<sizex+1;x++) { array[x]=new int **[sizey+1]; for(y=0;y<sizey+1;y++) { array[x][y]=new int *[sizez+1]; } }
erst die pointer erstellen, und immer wenn du neue werte einfügen willst, mit new die integer erstellen. zum auslesen guggst du erst, ob der pointer auf etwas verweist und dann auf was er verweist...
-
1. Wie übergebe ich als Schlüssel drei Werte
class Key{ int a,b,c; public: Key(int a_,int b_,int c_):a(a_),b(b_),c(c_){} bool operator==(const Key&key){return a==key.a&&b==key.b&&c==key.c;} //map braucht operator< da uns die Position in der Map nicht interssiert //geben wir irgend etwas zurück (muss friend sein) friend bool operator<(const Key&key1,const Key&key2){return key1.a<key2.a;} };
2. Wenn ich auf ein nicht belegten Schlüssel zugreife, erstellt die Map an der Position automatisch ein Schlüssel-Wertepaar, ohne das es benötigt wird.
Benutz map::find
map<Key,int>::iterator i=int_map.find(Key(5,5,6)); if(i!=int_map.end()) { //i is an iterator to a pair i->second=7; }
-
wie wärs mit deque?
-
thx irgendwer, des hört sich ganz gut an...
@sovok
hm ich kenn mich net noch net so gut aus mit c++, könntest du mal erklären wie ich des mit deque machen könnte?
thx
-
hm, wenn ich richtig verstanden hab, müsste ich, wenn ich deque verwende doch auch
speicher für die nicht belegten positionen verschwendengrüsse steve