Есть ли способ сделать 1D динамический и непрерывный массив с использованием C++ 11?
Я возьму размер массива через stdin
и после его создания его не нужно изменять.
Прямо сейчас я использую 1D вектор перечислений, и моя самая большая проблема с производительностью - это оператор vector [].
Если это невозможно сделать в C++, я открыт для способов сделать это с помощью malloc
и C, просто обратите внимание на лучший способ его delete
.
Редактировать: Не понимал, что векторы были день и ночь с отладкой и выпуском. Я перепробовал callgrind с -O3, и теперь проблема не в векторах - благодаря всем, кто заставил меня догадаться до того, как я переписал все это, используя массивы, когда это не нужно.
int size = 10;
std::unique_ptr<int[]> a(new int[size]);
Выполняет RAII (массив массива автообновляется) Однако я не думаю, что оператор vector [] должен быть проблемой производительности. В отладочной компиляции он может быть проверен, однако в выпуске он не должен.
В MSVC есть функция, называемая проверенными итераторами, которые могут "убить" производительность. Однако вы можете отключить эту функцию (просто Google)
Вы всегда можете динамически создавать непрерывное однородное хранилище определенного типа из кучи с использованием нового оператора
Type *pType = new Type[size](initial_value)
Чтобы удалить хранилище, необходимо явно вызвать оператор удаления массива
delete[] pType
Но, когда вы говорите, and my biggest performance issue is the vector [] operator.
, Я сомневаюсь. Вы прокомментировали розничную версию своего кода? Как вы знаете, что векторный индекс является вашим узким местом производительности?
std::vector
имеет достаточную производительность для использования в производстве. Он используется для решения задач по программированию конкурсов. Может быть, вы забыли скомпилировать в релиз?
Кроме того, вы можете использовать new
и delete
операторы.
Для бесплатной выделенной памяти используйте функцию free(void *ptr)
.
В C вы создаете одномерный массив с
int *ptr=NULL;
int num_elements = 0;
printf("how many elements?\n");
if(scanf("%d", &num_elements)==1) {
ptr = malloc(sizeof(int)*num_elements);
if(ptr == NULL) {
printf("unable to allocate %d elements\n", num_elements);
exit 0;
}
}
и когда вы закончите, вы позвоните
free(ptr);
Убедитесь, что вы вызываете его только один раз! Некоторые люди будут делать
if( ptr != NULL ) {
free(ptr);
ptr = NULL;
}
как защитное кодирование - предотвращает случайное освобождение его дважды.
free(NULL)
стандарте» не всегда было.
Если вы используете C++, использование malloc
, вероятно, является плохой (плохой) идеей.
int length;
cin >> length;
MyType * array = new MyType[length];
Затем, чтобы удалить,
delete[] MyType;
enums
? Почему вы не используете обычные целые числа?