Восстановить память, выделенную Reserve () - PullRequest
2 голосов
/ 09 марта 2012

Давайте

std::vector myVec;
myVec.reserve(10);

Если я выделил только 5 элементов, как я могу восстановить память, выделенную для других 5 элементов?

1 Ответ

8 голосов
/ 09 марта 2012
 std::vector<int> v(myVec);
 myVec.swap(v);

Это инициализирует вектор с тем же количеством элементов, однако для его хранения должно быть достаточно памяти.Затем он заменяется оригиналом, это должно поменять хранилище данных (используя дешевый обмен указателей), а слишком большой массив будет уничтожен.

или в C ++ 11 вы можете использовать std::vector::shrink_to_fit

myVec.shrink_to_fit();

http://en.cppreference.com/w/cpp/container/vector/shrink_to_fit

Если у вас это есть, это гораздо предпочтительнее, хотя это не является обязательным (зависит от реализации, сколько, если таковые имеются, удаляется), так что если это действительно большойвведите, затем убедитесь, что вы профилируете свой код, чтобы убедиться, что он удаляет их.

РЕДАКТИРОВАТЬ: как предположил Дэвид, существует сокращение для первого метода, если у вас нет C ++ 11, то есть:

std::vector<int>(myVec).swap(myVec);

Преимущество заключается в мгновенном уничтожении временного в конце выражения.

...