Программирование. Принципы и практика использования C++ Исправленное издание, стр. 254
v = v2; // присваиваем другой вектор; v — теперь копия v2 // теперь v.size() == v2.size()Стандартный библиотечный класс
vectorerase()insert()19.2.1. Представление
В разделе 19.1 мы продемонстрировали простейшую стратегию изменения размера: выделить память для нового количества элементов и скопировать туда старые элементы. Но если размер контейнера изменяется часто, то такая стратегия становится неэффективной. На практике, однажды изменив размер, мы обычно делаем это много раз. В частности, в программах редко встречается одиночный вызов функции
push_back()Итак, мы можем оптимизировать наши программы, предусмотрев изменение размера контейнера. На самом деле все реализации класса
vectorclass vector { int sz; // количество элементов double* elem; // адрес первого элемента int space; // количество элементов плюс свободная // память/слоты // для новых элементов (текущая память)public: // ...};Эту ситуацию можно изобразить графически.

Поскольку нумерация элементов начинается с нуля, мы показываем, что переменная
szspaceelem+szelem+spaceКогда вектор создается впервые, переменная
spacesz
Мы не начинаем выделение дополнительных слотов, пока количество элементов не изменится. Обычно это происходит, когда выполняется условие
space==szpush_back()Конструктор по умолчанию (создающий объект класса
vectorvector::vector():sz(0),elem(0),space(0) { }Эта ситуация выглядит следующим образом:

“Запредельный элемент” является лишь умозрительным. Конструктор по умолчанию не выделяет свободной памяти и занимает минимальный объем (см. упр. 16). Наш класс
vectorstd::vector19.2.2. Функции reserve и capacity
Самой главной операцией при изменении размера контейнера (т.е. при изменении количества элементов) является функция
vector::reserve()void vector::reserve(int newalloc){ if (newalloc<=space) return; // размер не уменьшается double* p = new double[newalloc]; // выделяем новую память for (int i=0; i<sz; ++i) p[i] = elem[i]; // копируем старые // элементы delete[] elem; // освобождаем старую память elem = p; space = newalloc;}Обратите внимание на то, что мы не инициализировали элементы в выделенной памяти. Мы просто резервируем память, а как ее использовать — задача функций
push_back()resize()Очевидно, что пользователя может интересовать размер доступной свободной памяти в объекте класса
vectorint vector::capacity() const { return space; }Иначе говоря, для объекта класса
vectorvv.capacity()–v.size()vpush_back()19.2.3. Функция resize
Имея функцию
reserve()resize()vector• Новый размер больше ранее выделенной памяти.
• Новый размер больше прежнего, но меньше или равен ранее выделенной памяти.
• Новый размер равен старому.
• Новый размер меньше прежнего.
Посмотрим, что у нас получилось.
void vector::resize(int newsize) // создаем вектор, содержащий newsize элементов // инициализируем каждый элемент значением 0.0 по умолчанию{ reserve(newsize); for (int i=sz; i<newsize; ++i) elem[i] = 0; // инициализируем