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.
Ich weiß, es würde mehr wie 'working_lattice [? *? *? +?] '. Aber wie? – unixman83
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. –
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. –