Ответ 1
Спецификация немного косвенная. capacity
указывается как:
size_type capacity() const noexcept;
Возвращает: общее количество элементов, которые вектор может удерживать, не требуя перераспределения.
Вторая часть происходит от reserve
:
reserve(size_type n);
Замечания: Reallocation делает недействительными все ссылки, указатели и итераторы, ссылающиеся на элементы в последовательность. Перераспределение не должно происходить во время вставок, которые происходят после вызова
reserve()
до тех пор, пока вставка не сделает размер вектора большим, чем значениеcapacity()
.
Из этого можно сделать вывод, что если размер меньше емкости, тогда вставка не вызывает перераспределения.
Нет единственного прямого указания, что вектор не перераспределяется, если есть свободная емкость, и вы явно не называете reserve
. Однако в [container.requirements.general] существует общее требование к контейнеру:
Если не указано иное (явно или путем определения функции в терминах других функций), вызов функции-члена контейнера или передача контейнера в качестве аргумента функции библиотеки не приведет к аннулированию итераторов или изменению значений объектов внутри этого контейнера.
Наконец, мы описываем эффекты вставки:
[insert/emplace_back/push_back:]
Примечания: вызывает перераспределение, если новый размер больше старой. Если перераспределение не происходит, все итераторы и ссылки до точки вставки остаются в силе.
Объединяя все вместе: если не указано иное, вызов функции-члена не отменяет итераторов. Перераспределение делает недействительными итераторы (как описано выше в разделе reserve
), поэтому, если не указано иное, вызов функции-члена и, в частности, вставки, не перераспределяется. Одна такая переопределяющая спецификация дается для случая, когда новый размер превышает текущая емкость.