у меня есть однокорневая иерархия объектов который каждый объект имеет указатель на свой родительский тип. Корневой объект является классом только для перемещения (он имеет ctor перемещения и оператор присваивания перемещения, но не имеет ctor по умолчанию или присваивания). Проблема в том, что я получил недействительные указатели, когда вектор растет. Вместо этого использование списка не является хорошим решением для меня.
Я ищу любые решения, чтобы изменить текущий дизайн.
Если вы знаете количество объектов, которые вы собираетесь хранить заранее, вы можете использовать std::vector::reserve
функция-член, чтобы гарантировать, что память не будет перераспределена. Это также может повысить производительность, поскольку обеспечивает лучшую локальность ссылок.
Если вы не знаете количество объектов заранее, вместо того, чтобы хранить объекты непосредственно в векторе и впоследствии использовать указатели на объекты, лучшим решением будет сохранение фактических указателей в векторе. Это очень хороший случай для использования std::unique_ptr
так как ваш вектор владеет объектами:
std::vector<std::unique_ptr<Object>> container;
std::unique_ptr<Object> object(new Object(/* */));
container.push_back(std::move(object));
В крайнем случае, вместо указателей вы могли бы использовать индексы, добиваясь при этом хорошего месторасположения. Проблема с этим подходом состоит в том, что вам также нужно будет сообщить вектор вызывающей стороне, которая хочет получить доступ к объектам.