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