C ++: Как правильно изменить размер динамически размещаемого массива? - PullRequest
5 голосов
/ 20 марта 2011

В C я бы сделал это, используя realloc.

В C ++ обычно рекомендуется использовать класс STL vector.

Но как правильно изменить размер массива в C ++ без использования какого-либо из перечисленных выше решений?

Ответы [ 4 ]

7 голосов
/ 20 марта 2011

Нет хорошего эквивалента realloc в C ++. Вам нужно будет вручную продублировать массив и скопировать старые элементы. К счастью, благодаря функции std::copy в <algorithm> это неплохо:

size_t k =  /* ... */
T* buffer = /* .. get old buffer of size k. .. */

T* newBuffer = new T[newSize];  // Assume newSize >= k
std::copy(buffer, buffer + k, newBuffer);

delete [] buffer;
buffer = newBuffer;

Надеюсь, это поможет!

РЕДАКТИРОВАТЬ: Изменение порядка двух последних строк! Упс!

3 голосов
/ 20 марта 2011

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

0 голосов
/ 21 марта 2011

Если вы настаиваете на том, чтобы сделать это самостоятельно в C ++, вы , вероятно, хотите сделать примерно так же, как std::vector, и выделить необработанную память с помощью глобального оператора new, а затем использовать размещение new для создания объектов "в место».

В противном случае вы в конечном итоге создаете объекты во всей выделенной памяти, а затем присваиваете их при использовании. Если вы не знаете , что начальная (по умолчанию) конструкция объекта является легкой, вы, скорее всего, избегаете ее.

0 голосов
/ 20 марта 2011
int* arr = new int[20];
...
//wanna resize to 25?
int* temp = new int[25];
std::copy(arr, arr+20, temp);
delete [] arr;
arr = temp;
... //now arr has 25 elements

Но, конечно, вы не должны этого делать:)

...