Восприятие большоего непрерывного куска памяти в куче как трёхмерный массив

Стоит задача аллоцировать кусок памяти в куче (примерно на 100 мб), обработать его и передать дальше как указатель и размер (после чего память можно освободить). Дело в том, что данные в нём, по факту трёхмерный массив uint8_t и на этапе обработки было бы очень удобно иметь интерфейс трёхмерного массива arr[x][y][z]. Не могу подобрать подходящий для этого инструмент. Вектор, векторов, векторов по понятным причинам не подходит. Аллоцировать трёхмерный массив на std::unique_ptr тоже.


Ответы (2 шт):

Автор решения: Harry

Код с 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;
}
→ Ссылка
Автор решения: HolyBlackCat

Если размер массива известен во время компиляции, то std::make_unique<std::array<...>>():

auto x = std::make_unique<std::array<std::array<std::array<int, 10>, 20>, 30>>();

Если неизвестен, то только делать свой класс с перегруженным operator[].

→ Ссылка