Индексирование трехмерного массива с использованием одного непрерывного блока памяти
vector<bool> working_lattice(box.rect.length * box.rect.height * box.rect.width);
Как я могу получить доступ working_lattice[1][5][3]
используя стиль объявления выше?
3 ответа
Вам нужно получить к нему доступ как
(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);
РЕДАКТИРОВАТЬ: Так как вы упомянули х, у, г в другом месте
working_lattice[(x * box.rect.length * box.rect.height) + (y * box.rect.height) + z);
Это зависит от того, используете ли вы мажорную строку или мажорную колонку. Строка-мажор более типична для C/C++, но вы можете сделать и то, и другое, если делаете это вручную.
При упорядочении основных рядов, чтобы добраться до i, j, k'-го элемента, вам нужно пройти через box.rect.height * box.rect.width * i
элементы, чтобы добраться до i
й ряд плюс box.rect.width * j
элементы, чтобы добраться до 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]
Это, очевидно, довольно раздражает, поэтому вы можете захотеть определить встроенную функцию или что-то, что поможет.
Т.е. учитывая это:
A[R][S][T]
при условии, что его базовый адрес addr_base_A
,
так что вы надеетесь, что вы можете получить адрес одного конкретного элемента A[i][j][k]
,
я думаю, что ответ: S*T*i + T*j + k + addr_base_A
,
Надеюсь это поможет:)