Влияет ли очистка вектора на его емкость? - PullRequest
22 голосов
/ 30 июля 2011

Я создаю экземпляр std::vector foo(1000).

foo.size() теперь 1000, а foo.capacity() также 1000.

Если я очищу вектор с помощью foo.clear(), size() теперь равен 0, но что такое capacity()? Стандарт говорит что-нибудь об этом?

Ответы [ 4 ]

22 голосов
/ 30 июля 2011

Нет, это не так.Емкость вектора никогда не уменьшается.Это не предусмотрено стандартом, но это так и в стандартных реализациях библиотек VC ++ и g ++.Чтобы установить емкость, достаточную для размера, используйте знаменитый трюк подкачки

vector<T>().swap(foo);

В стандарте C ++ 11 вы можете сделать это более явно:

foo.shrink_to_fit();
5 голосов
/ 30 июля 2011

Чтобы очистить вектор и использовать как можно меньше емкости, используйте трюк подкачки:

std::vector<T>().swap(foo);

Это создает пустой вектор, заменяет его внутренние элементы на foo, а затем уничтожает временный вектор, избавляясь от элементов, которые когда-то принадлежали foo, и оставляя foo, как если бы он был только что создан.

2 голосов
/ 30 июля 2011

Стандарт ничего не говорит о влиянии clear на capacity.

0 голосов
/ 30 июля 2011

Нет, очистка не влияет на ее емкость (), она остается прежней, даже если вы выполняете очистку. Если вы хотите уменьшить вектор, чтобы соответствовать, вы можете использовать следующий трюк после вызова clear: foo.swap (вектор (Foo));

...