Страницы

Поиск по вопросам

среда, 26 февраля 2020 г.

Динамический массив с произвольным количеством измерений

#алгоритм #cpp


Помогите разобраться с созданием массива:
задача в том, чтобы динамически построить массив с произвольным количеством измерений
и их произвольной глубиной.
На вход поступает одномерный массив int ndims[] с произвольным (n) количеством элементов,
где i-ый элемент определяет глубину i-го измерения целевого массива, а количество его
измерений, соответственно, равно n.
Алгоритм мне вроде и понятен: создаем массив глубиной ndims[0] с указателями, затем
создаем ndims[0] количество массивов глубиной ndims[1] и присваиваем их адреса элементам
первого массива, и так далее для каждого из созданных (можно оформить рекуррентно).
На бэйсике я бы это написал, так как там любой "указатель" - это банально integer,
содержащий адрес в памяти, нет никаких проблем с присваиванием и преобразованием. 
Но у меня маленький опыт писания на C++, я не слишком хорошо владею этим языком и
абсолютно не понимаю, как реализовать это всё на нем. Хотелось бы получить вашу помощь,
заранее спасибо!    


Ответы

Ответ 1



Можно представить массив в виде дерева. Динамический массив динамических массивов динамических массивов и т.д.. template struct MultiArray { MultiArray(const T& val=T()): Value(val) {}; MultiArray& operator[](uintp index) {return SubArrays[index];} void Add(const T& val) {SubArrays.push_back(val);} operator T&() {return Value;} vector SubArrays; T Value; }; Конечно, этот способ не самый лучший, так приходится хранить много лишнего. К тому же он не для новичков в C++. Это первое что пришло в голову. Надеюсь, разберёшься, как построить такой массив по массиву измерений?

Ответ 2



В стиле Си видится следующая реализация. Если не ошибаюсь, то общее количество элементов total получается for (total = 1, i = 0; i < n; i++) total = total * ndims[i]; Допустим, память занимаемая одним элементом elsize байт (Например для double elsize = sizeof(double)). Выделим память под все элементы массива double *ndimarr = malloc(total*elsize) // адрес первого элемента (все индексы 0) Далее для обращения к i,j,k... элементу вычислите его номер nelem (от начала). Указатель на этот элемент (его адрес) - ndimarr+nelem. Далее, надеюсь понятно.

Комментариев нет:

Отправить комментарий