У меня есть проект, где я читаю в массиве, который имеет 1 или более измерений, и для этого проекта мне нужно иметь возможность быстро определить соседей данного элемента. Я не знаю размерность раньше времени, и я также не знаю размер измерений раньше времени. В какой структуре данных C ++ лучше всего хранить эти данные? Коллега порекомендовал вектор векторов векторов. , ., но это кажется невероятно громоздким.
Если вы знаете адрес того, для какого элемента вам нужны соседи, просто сделайте арифметику с указателями, чтобы узнать соседей. Например, если p — местоположение элемента, то p— — левый сосед, а p ++ — правый сосед.
Представьте, что ваш многомерный массив — это одномерный массив. Пусть размерность массива d1 * d2 * ....* dn
Затем выделите память для 1D массив, скажем A
размера d1 * d2 * ....* dn
, Например,
int *A = new int[d1 * d2 * ....* dn];
Если вам нужно хранить данные в [i1][i2]...[in]
й индекс, затем сохраните в следующем индексе:
A[i1 * (d2*d3*d4.. *dn) + i2 * (d3*d4*....dn) + ..... + in]
Соседние элементы будут:
A[(i1 + 1) * (d2*d3*d4.. *dn) + i2 * (d3*d4*....dn) + ..... + in]
A[(i1 - 1) * (d2*d3*d4.. *dn) + i2 * (d3*d4*....dn) + ..... + in]
A[i1 * (d2*d3*d4.. *dn) + (i2 + 1) * (d3*d4*....dn) + ..... + in]
A[i1 * (d2*d3*d4.. *dn) + (i2 - 1) * (d3*d4*....dn) + ..... + in]
.............................
A[i1 * (d2*d3*d4.. *dn) + i2 * (d3*d4*....dn) + ..... + (in + 1)]
A[i1 * (d2*d3*d4.. *dn) + i2 * (d3*d4*....dn) + ..... + (in - 1)]