Индексирование трехмерного массива с использованием одного непрерывного блока памяти

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,

Надеюсь это поможет:)

Другие вопросы по тегам