На самом деле, стандарт делает указать, что должно произойти:
Это из 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.модификаторы]
iterator erase(iterator position);
iterator erase(iterator first, iterator last);
4) Сложность: Деструктор Т называется число раз, равное числу элементов стертых ....
Это означает, что элементы будет разрушена, но память останется неповрежденной. erase()
не влияет на мощность, поэтому resize()
и clear()
также не действуют.
Способ, которым я его читал, он спрашивает о влиянии на использование памяти - он конкретно задает вопрос о том, какое влияние на емкость оказывает изменение размера. Стандарт не определяет результат в этом случае, но единственная причина, по которой я могу думать, - это желание освободить неиспользованную память. Обмен с временным трюком - это идиоматический способ достижения этого. – mattnewport
В стандарте указан результат, не указывая уменьшение емкости() для этих операций. Поэтому он не может уменьшиться. – MSalters
Есть некоторые среды, где запрещено выделять или освобождать память после начальной фазы «строительства». Векторы можно использовать в этой среде, если можно быть уверенным, что они не пытаются выделять или освобождать память во время операций. Поэтому этот вопрос имеет значение в этой ситуации (что привело меня сюда). – meowsqueak