#алгоритм #cpp
Помогите разобраться с созданием массива: задача в том, чтобы динамически построить массив с произвольным количеством измерений и их произвольной глубиной. На вход поступает одномерный массив int ndims[] с произвольным (n) количеством элементов, где i-ый элемент определяет глубину i-го измерения целевого массива, а количество его измерений, соответственно, равно n. Алгоритм мне вроде и понятен: создаем массив глубиной ndims[0] с указателями, затем создаем ndims[0] количество массивов глубиной ndims[1] и присваиваем их адреса элементам первого массива, и так далее для каждого из созданных (можно оформить рекуррентно). На бэйсике я бы это написал, так как там любой "указатель" - это банально integer, содержащий адрес в памяти, нет никаких проблем с присваиванием и преобразованием. Но у меня маленький опыт писания на C++, я не слишком хорошо владею этим языком и абсолютно не понимаю, как реализовать это всё на нем. Хотелось бы получить вашу помощь, заранее спасибо!
Ответы
Ответ 1
Можно представить массив в виде дерева. Динамический массив динамических массивов динамических массивов и т.д.. templatestruct 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. Далее, надеюсь понятно.
Комментариев нет:
Отправить комментарий