N-мерные массивы произвольного типа и размера в C ++:
Этот ответ вдохновлен ответом Павла Радзивиловского, спасибо за это. Мне было немного сложно реализовать реализацию, так как это был мой первый опыт рекурсивных шаблонов. Я хотел бы поделиться тем, что я сделал, чтобы другие могли понять быстрее, чем я.
Я написал шаблонный класс c ++ для создания n-мерного массива произвольного типа и размера. Его необходимо создать с типом массива и количеством измерений. Размер может быть изменен динамически. Ниже я привел голую (раздетую) рабочую версию того, как создать многомерный массив, доступ к элементам которого можно получить с помощью последовательного применения оператора [] (например, array [x] [y] [ г]). Эта версия может работать только с массивами измерения n> 1. Основная функция показывает, как создать 4-мерный массив целых чисел в качестве примера.
EDIT : имейте в виду, что приведенный ниже пример минимален для удобства чтения, так как он не освобождает массив и не проверяет границы при доступе. Добавление этого тривиально и оставлено на усмотрение программиста.
#include <stdio.h>
#include <stdlib.h>
template <typename T, int N>
struct array {
array<T,N>() : data(NULL), offset((int*) malloc(sizeof(int)*N)){}
array<T,N>(T *data, int *offset) : data(data), offset(offset){}
array<T,N-1> operator[](int i){return array<T,N-1>(&data[i*offset[N]], offset);}
bool resize(int *size){
offset[N-1] = 1;
int total_size = size[N-1];
for(int i = N-2; i >= 0; i--){
total_size *= size[i];
offset[i] = offset[i+1]*size[i+1];
}
return (data = (T*) realloc (data, total_size*sizeof(T)));
}
T *data;
int *offset;
};
template <typename T>
struct array<T,1>{
array<T,1>(T *data, int *offset) : data(data){}
T& operator[](int i){return data[i];}
T *data;
};
int main () {
array<int, 4> a;
// create array with dimensions [1][3][3][7]
int size[4] = { 1, 3, 3, 7 };
a.resize(size);
a[0][1][2][3] = 123;
return 0;
}
Наслаждайтесь.