Изменение размера в 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[]для необработанных буферов, если только вы не реализуете векторный контейнер.