Лучший способ динамически увеличивать размер массива в C ++

Предположим, у меня есть массив символов, выделенный с помощью new.Now, если я хочу изменить размер массива, какой из следующих двух является лучшим методом?
1. используя функцию realloc ИЛИ ЖЕ
2. Выделите новый массив, скопируйте данные из старого массива в новый массив и затем удалите старый массив.

0

Решение

Выделите блок, используя malloc (не new), а затем используйте realloc. realloc знает, сколько свободного места доступно после блока для расширения.

s2 = realloc(s,<size>);
if (s2) {
s = s2;
}
else {
free up s and handle the error
}

Большая часть кода, который я видел, неправильно обрабатывает сбой realloc.

2

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

Вы не можете переносить realloc на буфер, выделенный с помощью new. Следовательно, возможен только второй вариант.

Попробуйте переключиться на std :: vector и std :: string.

1

Я думаю, что вы думаете обо всем этом с точки зрения Си.

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

например

vector v(10); // allocates an array of 10 initialized to 0
v.push_back(42); // added another, so now array is 11 long
1

Первый вариант также предполагает копирование, если realloc обнаруживает, что после блока недостаточно свободного места. (Даже если вы использовали malloc для выделения массива, который является единственным правильным вариантом для использования realloc совсем.)

Однако, если вы удваиваете размер массива при каждом перераспределении (или умножаете его размер на константу> 1), операция «увеличить массив на единицу» использует постоянная время в среднем. Ищи Постоянное амортизированное время.

Предположим, что массив начального размера n. Перераспределение на новый размер 2n и копирование стоит 2n шагов, но следующая операция n «увеличения» бесплатна.

Кстати, это как std::vector и многие другие контейнеры массивов реализованы внутри.

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