Ну, если бы вы хотели изменить размер массива, что бы вы сделали? Вы должны создать новое и скопировать все значения поверх - будь то индивидуально или с помощью memcpy или чего-то еще. Вы не можете изменить размер массива в C или C ++.
std::vector
в значительной степени гарантированно будет реализован с использованием массива для его хранения (IIRC, стандарт не гарантирует, что это массив, но массив - это единственное, что может удовлетворить различные требования API, такие как насколько эффективной должна быть каждая операция, так что, в действительности, она гарантирована, даже если эта гарантия не является явной). Поскольку он реализован с использованием массива, и вы не можете изменять размеры массивов без копирования, вы не можете изменять размеры векторов без копирования.
Теоретически вы могли бы иметь функцию shrink_capacity()
, которая скрывала бы тот факт, что вам пришлось временно более или менее удвоить требования к размеру, но поскольку std::vector
в настоящее время не имеет такой функции, вы должны фактически явная копия. Трюк со свопом - просто хороший способ сделать это.
Если вы действительно заботитесь о памяти в таком случае, то вы можете использовать указатели (или умные указатели) вместо того, чтобы вектор содержал объекты напрямую. Это может быть не совсем желательно, но это уменьшит ваши требования к памяти.