На самом деле, стандарт определяет, что должно произойти:
Это из vector
, но тема одинакова для всех контейнеров (list
, deque
и т. Д ...)
23.2.4.2 емкость вектора [lib.vector.capacity]
void resize(size_type sz, T c = T());
6) Эффекты:
if (sz > size())
insert(end(), sz-size(), c);
else if (sz < size())
erase(begin()+sz, end());
else
; //do nothing
То есть: если размер, указанный в resize
, меньше количества элементов, эти элементы будут удалены из контейнера. Что касается capacity()
, это зависит от того, что erase()
делает с ним.
Я не могу найти его в стандарте, но я почти уверен, что clear()
определено как:
void clear()
{
erase(begin(), end());
}
Следовательно, эффекты clear()
на capacity()
также связаны с эффектами erase()
на него. Согласно стандарту:
23.2.4.3 векторные модификаторы [lib.vector.modifiers]
iterator erase(iterator position);
iterator erase(iterator first, iterator last);
4) Сложность: деструктор T называется числом раз, равным количеству стертых элементов ....
Это означает, что элементы будут разрушены, но память останется нетронутой. erase()
не влияет на емкость, поэтому resize()
и clear()
также не влияют.