C ++: динамически растущий 2d массив

У меня следующая ситуация решена с vector, но один из моих старших коллег сказал мне в дискуссии, что с массивом будет намного быстрее.

Я рассчитываю много (и я имею в виду много!) 12-мерных векторов из множества аудиофайлов и должен хранить их для обработки. Мне действительно нужны все эти векторы, прежде чем я смогу начать свои вычисления. Во всяком случае, я не могу предсказать, сколько аудио, и я не могу предсказать, сколько векторов извлекается из каждого аудио. Поэтому мне нужна структура для динамического хранения векторов.

Поэтому я создаю новый двойной массив для каждого вектора и помещаю его в vector,

Теперь я хочу проверить и проверить, действительно ли мой коллега прав, что расчет можно ускорить, используя для хранения также массив вместо вектора.

vector<double*>* Features = new vector<double*>();
double* feature = new double[12];
// adding elements
Features->push_back(features);

Насколько я знаю, для создания динамически 2d массива мне нужно знать количество строк.

double* container = new double*[rows];
container[0] = new double[12];
// and so on..

Я знаю строки после обработки всех аудио, и я не хочу обрабатывать аудио дважды.

Кто-нибудь получил какие-либо идеи о том, как решить эту проблему и добавить ее, или это просто невозможно, и я должен использовать либо vector или создать собственную структуру (которая предположительно может быть медленнее, чем вектор).

0

Решение

Если нет веских причин не делать этого, я бы предложил что-то вроде этого:

std::vector<std::array<double, 12>> Features;

Вы получаете всю необходимую вам область памяти и все необходимое автоматическое управление памятью.

4

Другие решения

Вы, конечно, можете сделать это, но было бы намного лучше, если бы вы выполняли это с std::vector, Для динамического роста двумерного массива вам придется выполнить все эти вещи.

  • Создать временный 2D-массив
  • Выделите ему память.
  • Выделите память для каждого его компонента массива.
  • Скопируйте данные в свои массивы компонентов.
  • Удалите каждый массив компонентов исходного 2D-массива.
  • Удалить 2D массив.
  • Возьмите новый вклад.
  • Добавить новый элемент во временный 2D-массив.
  • Создайте оригинальный 2D-массив и выделите для него память.
  • Выделите память для ее компонентных массивов.
  • Скопируйте временные данные в это снова.

После каждого шага вряд ли допустимо, чтобы массивы были быстрее. использование std:vector, Приведенные выше письменные ответы объясняют это.

2

Использование вектора облегчит проблему, поскольку позволяет автоматически наращивать объем данных. К сожалению, из-за того, как растут векторы, использование векторов может оказаться не лучшим решением из-за количества раз, которое требуется для роста большого набора данных. С другой стороны, если вы устанавливаете начальный размер вектора достаточно большим, но вам нужно только небольшое количество из 12 индексных массивов. Вы просто потратили много памяти. Если есть какое-то средство для получения предположения о требуемом размере, вы можете использовать это значение предположения для динамического размещения массивов или изначально установить вектор на этот размер.

Если вы собираетесь рассчитывать с данными только один или два раза, чем, возможно, вам следует рассмотреть возможность использования карты или списка. Эти две структуры для больших массивов создадут структуру памяти, которая точно соответствует вашим потребностям, и обойдут дополнительные временные требования для роста массивов. С другой стороны, вычисления с этими структурами данных будут медленнее.

Я надеюсь, что эти мысли добавляют некоторые альтернативные решения к этой дискуссии.

0
По вопросам рекламы [email protected]