N-мерные массивы произвольного типа и размера в C++:
Этот ответ вдохновлен ответом Павла Радзивиловского, спасибо за это. Мне было немного трудно реализовать реализацию, так как это был мой первый опыт работы с рекурсивными шаблонами. Я хотел бы поделиться тем, что я сделал, чтобы другие могли понять быстрее, чем я.
Я написал класс шаблона С++ для создания n-мерного массива произвольного типа и размера. Он должен быть создан с типом массива и количеством измерений. Размер может изменяться динамически. Ниже я привел голую (урезанную) рабочую версию того, как создать многомерный массив, к элементам которого можно получить доступ через последовательное применение operator[] (например, 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;
}
Наслаждаться.
person
gospes
schedule
13.08.2014