Восприятие большоего непрерывного куска памяти в куче как трёхмерный массив
Стоит задача аллоцировать кусок памяти в куче (примерно на 100 мб), обработать его и передать дальше как указатель и размер (после чего память можно освободить). Дело в том, что данные в нём, по факту трёхмерный массив uint8_t и на этапе обработки было бы очень удобно иметь интерфейс трёхмерного массива arr[x][y][z]. Не могу подобрать подходящий для этого инструмент. Вектор, векторов, векторов по понятным причинам не подходит. Аллоцировать трёхмерный массив на std::unique_ptr тоже.
Ответы (2 шт):
Код с https://ideone.com/fod4Jd:
#include <iostream>
using namespace std;
int main(int argc, char * argv[])
{
unsigned char * p = new unsigned char [3*5*2];
unsigned char (&a)[3][5][2] = *(unsigned char (*)[3][5][2])p;
a[1][2][1] = 121;
a[0][3][0] = 30;
cout << (int)p[1*5*2 + 2*2 + 1] << endl;
cout << (int)p[0*5*2 + 3*2 + 0] << endl;
}
Если размер массива известен во время компиляции, то std::make_unique<std::array<...>>():
auto x = std::make_unique<std::array<std::array<std::array<int, 10>, 20>, 30>>();
Если неизвестен, то только делать свой класс с перегруженным operator[].