У меня следующая ситуация решена с 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
или создать собственную структуру (которая предположительно может быть медленнее, чем вектор).
Если нет веских причин не делать этого, я бы предложил что-то вроде этого:
std::vector<std::array<double, 12>> Features;
Вы получаете всю необходимую вам область памяти и все необходимое автоматическое управление памятью.
Вы, конечно, можете сделать это, но было бы намного лучше, если бы вы выполняли это с std::vector
, Для динамического роста двумерного массива вам придется выполнить все эти вещи.
После каждого шага вряд ли допустимо, чтобы массивы были быстрее. использование std:vector
, Приведенные выше письменные ответы объясняют это.
Использование вектора облегчит проблему, поскольку позволяет автоматически наращивать объем данных. К сожалению, из-за того, как растут векторы, использование векторов может оказаться не лучшим решением из-за количества раз, которое требуется для роста большого набора данных. С другой стороны, если вы устанавливаете начальный размер вектора достаточно большим, но вам нужно только небольшое количество из 12 индексных массивов. Вы просто потратили много памяти. Если есть какое-то средство для получения предположения о требуемом размере, вы можете использовать это значение предположения для динамического размещения массивов или изначально установить вектор на этот размер.
Если вы собираетесь рассчитывать с данными только один или два раза, чем, возможно, вам следует рассмотреть возможность использования карты или списка. Эти две структуры для больших массивов создадут структуру памяти, которая точно соответствует вашим потребностям, и обойдут дополнительные временные требования для роста массивов. С другой стороны, вычисления с этими структурами данных будут медленнее.
Я надеюсь, что эти мысли добавляют некоторые альтернативные решения к этой дискуссии.