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

위의 선언 스타일을 사용하여 working_lattice[1][5][3]에 액세스하려면 어떻게합니까?하나의 인접한 메모리 블록을 사용하여 3 차원 배열에 인덱싱

+0

나는 그것이 'working_lattice [? *? *? +?]'. 그러나 어떻게? – unixman83

+0

순간적으로'벡터 '과 관련된 이상한 점을 무시하고 [이전 답변] (http : //)에서'matrix [a] [b] [c]'표기법을 사용하여 액세스 할 수있는 3D 매트릭스를 보여주었습니다. stackoverflow.com/a/2216055/179910). 현재로서는 크기를 템플릿 매개 변수로 전달하지만 대신 ctor 매개 변수로 전달하는 데 엄청난 양이 소요되지는 않습니다. 만약 내가 오늘 쓰고 있었다면, 나는 틀림없이 실제 3D 배열 대신에'std :: vector'를 사용할 것입니다. 그러면 크기를 ctor에 전달하는 것이 간단 할 것입니다. –

+0

3 개의 중첩 된 벡터는 하나의 인접한 메모리 블록으로 저장됩니다. 각 벡터 자체는 인접한 메모리 블록에 저장되기 때문입니다. 이것은 또한 기계가 오프셋을 계산하기 위해 곱셈 작업을 수행하게합니다. –

답변

4

당신은 귀하의 경우 그래서

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

로 접근 할 필요가

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

또는

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

편집 : 당신은 X, Y를 언급 한 이후, z를 다른 곳

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

downvoter가 이유에 관해 언급 할 수 있습니까? 그는 이미 그것을 대답으로 받아 들였다. – josephthomas

3

이는 행 메이저 또는 열 메이저를 사용하는지 여부에 달려 있습니다. 행 메이저는 C/C++에서 더 일반적인 것이지만 수동으로 수행하는 경우에도 수행 할 수 있습니다.

행 주요 순서에

에서, I, J, k 번째 요소에 도착, 당신의 j 번째 열을 얻을 수있는 i 번째 행까지 얻을 수 box.rect.height * box.rect.width * i 요소를 통해 갈 필요가 플러스 box.rect.width * j 요소 이 행에 k을 더하면 깊이가 k입니다. 슈퍼 명시하려면

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] 

이 분명 꽤 성가신, 당신이 도와 인라인 함수 또는 무언가를 정의 할 수 있습니다 있도록.