2012-03-08 2 views

ответ

8
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

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

EDIT: а Дэвид предложил есть сокращение для первого метода, если у вас нет C++ 11, который:

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

Это имеет преимущество мгновенно разрушив временное в конце выражения ,

+0

Просто имейте в виду, что 'shrink_to_fit' является необязательным запросом. –

+0

, а также этот вектор может оптимизировать распределение путем предварительного распределения некоторых элементов – PlasmaHH

+0

+1, сокращением, которое не требует создания новой переменной, будет: 'std :: vector (myVec) .swap (myVec);', который создает * временный *, свопит его и сразу же уничтожает. –

Смежные вопросы