Посмотрите на Скотта Мейерса Эффективный STL, пункт 17.
В принципе, вы не можете напрямую уменьшить размер хранилища std::vector
. resize()
и reseve()
никогда не уменьшат фактический объем памяти контейнера. «Хитрость» заключается в том, чтобы создать новый контейнер нужного размера, скопировать данные и заменить их текущим контейнером. Если мы хотим очистить контейнер, это просто:
std::vector<T>().swap(v);
Если нам нужно скопировать данные, то нам нужно сделать копию:
std::vector<T>(v).swap(v);
То, что это делает, создает новый вектор с данными из старого, делая копию, которая потребуется в любой операции, которая дает необходимый эффект. Тогда вызов swap()
просто поменяет внутренние буферы между объектами. В конце строки созданный временный вектор удаляется, но у него есть кишки из старого вектора, а у старого вектора есть кишки из новой копии, точный размер, который нам нужен.