Изменение размера в C ++ неудобно из-за потенциальной необходимости вызывать конструкторы и деструкторы.
Я не думаю, что есть фундаментальная причина, почему в C ++ у вас не могло быть оператора resize[]
для работы сnew[]
и delete[]
, которые сделали что-то похожее на это:
newbuf = new Type[newsize];
std::copy_n(oldbuf, std::min(oldsize, newsize), newbuf);
delete[] oldbuf;
return newbuf;
Очевидно, oldsize
будет получено из секретного местоположения, то же самое, что в delete[]
, и Type
будетпроисходят от типа операнда.resize[]
потерпит неудачу, если тип не может быть скопирован - и это правильно, поскольку такие объекты просто не могут быть перемещены.Наконец, приведенный выше код строит объекты по умолчанию перед их назначением, которое вы не хотели бы использовать в качестве фактического поведения.
Существует возможная оптимизация, где newsize <= oldsize
, для вызова деструкторов для объектов "после конца"из вновь зачарованного массива и больше ничего не делать.Стандарт должен был бы определить, требуется ли эта оптимизация (например, когда вы resize()
вектор), разрешена, но не указана, разрешена, но зависит от реализации или запрещена.
Вопрос, который вы должны задать себе, заключается в следующем:"действительно ли это полезно для обеспечения этого, учитывая, что vector
также делает это и специально разработано для предоставления контейнера с изменяемым размером (непрерывной памяти) - это требование опущено в C ++ 98, но исправлено в C ++ 03) это лучше подходит, чем массивы с C ++ способами ведения дел? "
Я думаю, что ответ, как обычно думают, будет" нет ".Если вы хотите сделать изменяемые размеры буферов способом C, используйте malloc / free / realloc
, которые доступны в C ++.Если вы хотите сделать изменяемые размеры буферов способом C ++, используйте вектор (или deque
, если вам на самом деле не требуется непрерывное хранение).Не пытайтесь смешивать их, используя new[]
для необработанных буферов, если только вы не реализуете векторный контейнер.