3
vector<bool> working_lattice(box.rect.length * box.rect.height * box.rect.width); 

Wie greife ich auf working_lattice[1][5][3] unter Verwendung des obigen Deklarationsstils zu?Indexieren eines dreidimensionalen Arrays mit einem einzelnen zusammenhängenden Speicherblock

+0

Ich weiß, es würde mehr wie 'working_lattice [? *? *? +?] '. Aber wie? – unixman83

+0

Ich ignorierte die Seltsamkeiten, die mit 'vector ' assoziiert sind. Ich zeigte eine 3D-Matrix, auf die Sie zugreifen können, indem Sie die Matrix [a] [b] [c] '-Notation in einer [alten Antwort] verwenden (http: // stackoverflow.com/a/2216055/179910). Im Moment übergibt es die Größe als Template-Parameter, aber es würde nicht viel Zeit kosten, es als Ctor-Parameter zu übergeben. Wenn ich es heute schreiben würde, würde ich zweifellos einen 'std :: vector' anstelle eines tatsächlichen 3D-Arrays verwenden, was es trivial machen würde, die Größe an den ctor zu übergeben. –

+0

Drei verschachtelte Vektoren würden auch als ein zusammenhängender Speicherblock gespeichert werden, da jeder Vektor selbst in einem zusammenhängenden Speicherblock gespeichert wird. Dies würde auch die Maschine die Multiplikation durchführen lassen, um den Offset für Sie herauszufinden. –

Antwort

4

Sie benötigen für den Zugriff als

(i * length * height) + (j * height) + k 

So in Ihrem Fall

working_lattice[(i * box.rect.length * box.rect.height) + (j * box.rect.height) + k); 

oder

working_lattice[(1 * box.rect.length * box.rect.height) + (5 * box.rect.height) + 3); 

EDIT: Da Sie x erwähnt, y, z anderswo

working_lattice[(x * box.rect.length * box.rect.height) + (y * box.rect.height) + z); 
+0

Kann der Downvoter kommentieren, warum? Er hat es bereits als Antwort akzeptiert – josephthomas

3

Dies hängt davon ab, ob Sie Zeilenreihenfolge oder Spaltenreihenfolge verwenden. Row-major ist in C/C++ typischer, aber Sie können beides tun, wenn Sie es manuell tun.

In Reihe-Dur-Bestellung, auf das i, j, k-ten Element zu erhalten, müssen Sie durch box.rect.height * box.rect.width * i Elemente, um zur i ten Reihe zu bekommen, und box.rect.width * j Elemente zur j ten Spalte bekommen von diese Zeile, plus k, um zurück zum k ten Element in der Tiefe zu kommen. Um super explizit:

const size_t n_x = box.rect.length; 
const size_t n_y = box.rect.height; 
const size_t n_z = box.rect.width; 
working_lattice[1 * n_x * n_z + 5 * n_z + 3] 

Das ist offensichtlich ziemlich ärgerlich ist, so dass Sie vielleicht eine Inline-Funktion oder etwas zu helfen, definieren.