Как осуществляется изменение размера вектора? - PullRequest
0 голосов
/ 18 января 2011

Я пытаюсь выяснить, как вектор добавляет больше объектов после того, как он уже "создал" некоторые, я имею в виду:

int *ptr;
ptr = new int;

Как после этого вы можете добавить большеобъекты к этому указателю?(сделайте его массивом)
Спасибо!

Ответы [ 6 ]

7 голосов
/ 18 января 2011

Большинство реализаций начинаются с небольшого массива, и всякий раз, когда он достигает своей емкости, выделяется новый массив двойного размера, а старые элементы копируются в новый массив.

4 голосов
/ 18 января 2011

Как и в большинстве контейнеров STL, он использует внешний распределитель для фактического выделения памяти.Это второй параметр шаблона для вектора.

Для создания объектов в памяти он использует Place-New.

Для добавления большего количества объектов, когда ему не хватает памяти, он должен выделить большеколичество.Если базовым типом является POD, он может просто realloc, но если нет, он должен переместить их с помощью operator=.

объекта.
3 голосов
/ 18 января 2011

Вы не можете сделать его массивом, вы можете указать только один.

Итак, когда вы делаете это:

int *ptr;
ptr = new int;

вы указали указатель ptr на вновь созданное целое число. Вы можете удалить его, создать массив и указать ptr на этот массив:

delete ptr;
ptr = new int[5];
0 голосов
/ 18 января 2011

Вектор отслеживает два бита информации.

  1. Это размер, который является количеством элементов, которые он в данный момент удерживает.
  2. Это емкость, или сколько элементов она может фактически содержать до нехватки памяти.

Если добавление элемента не приводит к превышению его емкости, проблем не возникает. Он просто добавляет новый элемент.

Если емкость будет превышена, он рассчитает новую емкость (обычно в 1,5-2 раза больше текущей емкости) и скопирует все элементы в новый массив. Вот почему итераторы становятся недействительными после добавления элемента в вектор. Они могут ссылаться на старый (теперь освобожденный) массив.

0 голосов
/ 18 января 2011
1. Build an array.
2. copy *ptr into it.
3. swap ptrs.
4. delete the temp.

Ну вот, теперь вы "изменили размеры" своего ptr.

0 голосов
/ 18 января 2011

Вектор может изменить размер, потому что это класс. Он скрывает данные внутри объекта, и вы не можете видеть его внутреннюю структуру напрямую. Вы просто работаете с его публичным интерфейсом. Он может выделить новый массив большего размера, скопировать в него данные, даже не увидев его.

Вы не можете сделать это с помощью int *, потому что у вас нет здесь класса, нет места, чтобы скрыть реальную реализацию от пользователя.

...