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