Я пытаюсь выяснить, как вектор добавляет больше объектов после того, как он уже «создал» некоторые, я имею в виду:
int *ptr;
ptr = new int;
Как после этого вы можете добавить больше объектов к этому указателю? (сделайте это массивом)
Спасибо!
Я пытаюсь выяснить, как вектор добавляет больше объектов после того, как он уже «создал» некоторые, я имею в виду:
int *ptr;
ptr = new int;
Как после этого вы можете добавить больше объектов к этому указателю? (сделайте это массивом)
Спасибо!
Большинство реализаций начинают с небольшого массива, и всякий раз, когда он достигает своей емкости, выделяется новый массив двойного размера, а старые элементы копируются в новый массив.
reserve()
).
- person Kos; 18.01.2011
Как и в большинстве контейнеров STL, он использует внешний распределитель для фактического выделения памяти. Это второй параметр шаблона для вектора.
Он использует новое размещение для создания объектов в памяти.
Для добавления большего количества объектов, когда ему не хватает памяти, он должен выделить больший объем. Если базовым типом является POD, он может просто realloc
, но если нет, он должен перемещать их с operator=
объекта.
realloc()
? Таким образом, malloc()
не устарел в С++, а new
неизбежен только тогда, когда объект для выделения не является POD. Можете ли вы указать мне хороший документ, в котором объясняется, почему в С++ нет оператора renew
?
- person Iharob Al Asimi; 05.07.2015
std::vector
полностью устраняет необходимость, но мне просто любопытно, спасибо за ответ.
- person Iharob Al Asimi; 06.07.2015
Вы не можете сделать его массивом, вы можете указать его только на один.
Итак, когда вы делаете это:
int *ptr;
ptr = new int;
вы указали указатель ptr на вновь созданное целое число. Вы можете удалить его и создать массив и указать ptr на этот массив:
delete ptr;
ptr = new int[5];
1. Build an array.
2. copy *ptr into it.
3. swap ptrs.
4. delete the temp.
Вот и все, теперь вы «изменили размер» вашего указателя мыши.
Вектор отслеживает два бита информации.
Если добавление элемента не приводит к превышению его емкости, то проблем нет. Он просто добавляет новый элемент.
Если емкость будет превышена, он рассчитает новую емкость (обычно в 1,5-2 раза больше текущей емкости) и скопирует все элементы в новый массив. Вот почему итераторы становятся недействительными после добавления элемента в вектор. Они могут иметь в виду старый (теперь освобожденный) массив.
Вектор может изменять размер, потому что это класс. Он скрывает данные внутри объекта, и вы не можете напрямую увидеть его внутреннюю структуру. Вы просто работаете с его публичным интерфейсом. Он может выделить новый массив большего размера и скопировать в него данные без вашего ведома.
Вы не можете сделать это с int*, потому что здесь нет класса, нет места, чтобы скрыть реальную реализацию от пользователя.
int* arr = new int[n];
, но было бы сложно самостоятельно отслеживать логический размер по сравнению с выделенным размером.
- person Dawson; 18.01.2011