У меня простой вопрос: почему с помощью вектора указателей сработало, и когда бы вы создали вектор объектов вместо вектора указателей на эти объекты?
std::vector
это как необработанный массив, выделенный с новым и перераспределенным, когда вы пытаетесь вставить больше элементов, чем его текущий размер.
Итак, если он содержит A
указателей, это похоже на манипулирование массивом A*
.Когда ему нужно изменить размер (вы push_back()
элемент, пока он уже заполнен до его текущей емкости), он создаст другой массив A*
и скопирует в массив A*
из предыдущего вектора.
Если он содержит A
объектов, то это как если бы вы манипулировали массивом A
, поэтому A
должен конструироваться по умолчанию, если происходят автоматические перераспределения.В этом случае целые A
объекты тоже копируются в другой массив.
Видите разницу? Объекты A
в std::vector<A>
могут изменить адрес, если вы выполняете некоторые манипуляции, требующие изменения размера внутреннего массива. Именно в этом состоит большинство проблем, связанных с содержанием объектов в std::vector
.
Способ использования std::vector
без таких проблем - выделить достаточно большой массив с самого начала. Ключевое слово здесь - «емкость». Емкость std::vector
- это реальный размер буфера памяти, в который он будет помещать объекты.Таким образом, для настройки емкости у вас есть два варианта:
1) изменить размер std::vector
на конструкцию, чтобы построить все объекты с самого начала, с максимальным количеством объектов, - которые будут вызывать конструкторы каждого объекта.
2) после создания std::vector
(но в нем ничего нет), использует свою функцию reserve()
: вектор будет выделять достаточно большой буфер (вы предоставляете максимумразмер вектора). Вектор устанавливает емкость.Если вы push_back()
объекты в этом векторе или resize()
ниже предела размера, который вы указали в вызове reserve()
, он никогда не перераспределит внутренний буфер, и ваши объекты не изменят местоположение в памяти, делая указатели наэти объекты всегда действительны (некоторые утверждения, чтобы проверить, что изменение емкости никогда не происходит, является отличной практикой).