Как изменить размер выделенного массива динамической памяти до определенного значения? - PullRequest
0 голосов
/ 21 сентября 2011

Итак, у меня есть массив с именем digits, который имеет динамически выделенную память Начальная емкость по умолчанию равна 20. Я пытаюсь выяснить, как реализовать следующий код, чтобы в случае добавления чего-либо в массив, превышающий емкость, код создаст новый массив, равный 2 ^ n. больше (т.е. 40, 80, 160). однако я хочу, чтобы в нем был цикл for, который будет увеличивать массив на 2 ^ n, пока новая емкость не станет больше введенной.

void BigNum::resize(size_t n)
{
size_t *NEW_CAPACITY;

if(n == capacity)
    return; // The allocated memory is already the right size

if(n < used)
    n = used;

NEW_CAPACITY = new size_t[n];
copy(digits, digits + used, NEW_CAPACITY);
delete[] digits;
    digits = NEW_CAPACITY;
capacity = n;

Любая помощь очень ценится

Ответы [ 2 ]

0 голосов
/ 21 сентября 2011

"Я пытаюсь выяснить, как реализовать следующий код, чтобы в случае добавления чего-либо в массив, превышающий емкость, код создаст новый массив на 2 ^ n больше (т. Е. 40, 80, 160). Однако я хочу, чтобы в нем был цикл for, который будет увеличивать массив на 2 ^ n до тех пор, пока новая емкость не станет больше введенной. "

Во-первых, я думаю, что вы имеете в виду 2 * n, а не 2 ^ n.

Во-вторых, почему бы не использовать std :: vector, как говорили другие комментаторы?

В-третьих, я не до конца понимаю ваш вопрос, но звучит так, будто вы этого хотите:

int newCapacity = capacity;
while( newCapacity < n )
  newCapacity *= 2;

Это кажется довольно тривиальным, так что вы можете уточнить свой вопрос?

0 голосов
/ 21 сентября 2011

Если вы пишете код на языке C с использованием синтаксиса C ++ - используйте методы C: realloc и malloc.

Если вы пишете код на C ++ - используйте std::vector вместо массивов.

Цикл , на который вы ссылаетесь, представляет собой простой расчет:

while(current<required) {
    current = 2*current;
}
new_digits = realloc(digits, current);
// check that the allocation succeeded, handle errors, no need
// to copy data - realloc does that for you.

готово.

...