Короткий ответ - весь массив, содержащий данные вектора, перемещается в место, где есть место для роста.Класс векторов резервирует больший массив, чем это технически требуется для хранения количества элементов в векторе.Например:
vector< int > vec;
for( int i = 0; i < 100; i++ )
vec.push_back( i );
cout << vec.size(); // prints "100"
cout << vec.capacity(); // prints some value greater than or equal to 100
Метод capacity()
возвращает размер массива, зарезервированного вектором, а метод size()
возвращает количество элементов в массиве, которые фактически используются.capacity()
всегда будет возвращать число, большее или равное size()
.Вы можете изменить размер резервного массива, используя метод reserve()
:
vec.reserve( 400 );
cout << vec.capacity(); // returns "400"
Обратите внимание, что size()
, capacity()
, reserve()
и все связанные методы относятся к отдельным экземплярамТип, что вектор держит.Например, если параметр типа vec
T является структурой, которая занимает 10
байтов памяти, то vec.capacity()
, возвращая 400
, означает, что вектор фактически имеет 4000
байтов зарезервированной памяти (400 x 10 = 4000
).
Так что же произойдет, если к вектору будет добавлено больше элементов, чем у него есть емкость? В этом случае вектор выделяет новый резервный массив (обычно в два раза больше старого массива).), копирует старый массив в новый массив, а затем освобождает старый массив.В псевдокоде:
if(capacity() < size() + items_added)
{
size_t sz = capacity();
while(sz < size() + items_added)
sz*=2;
T* new_data = new T[sz];
for( int i = 0; i < size(); i++ )
new_data[ i ] = old_data[ i ];
delete[] old_data;
old_data = new_data;
}
Таким образом, все хранилище данных перемещается в новое место в памяти, где достаточно места для хранения текущих данных, а также ряда новых элементов.Некоторые векторы могут также динамически уменьшать размер своего резервного массива, если у них выделено гораздо больше места, чем требуется на самом деле.