Хранить объекты корневой иерархии в векторе

у меня есть однокорневая иерархия объектов который каждый объект имеет указатель на свой родительский тип. Корневой объект является классом только для перемещения (он имеет ctor перемещения и оператор присваивания перемещения, но не имеет ctor по умолчанию или присваивания). Проблема в том, что я получил недействительные указатели, когда вектор растет. Вместо этого использование списка не является хорошим решением для меня.

Я ищу любые решения, чтобы изменить текущий дизайн.

2

Решение

Если вы знаете количество объектов, которые вы собираетесь хранить заранее, вы можете использовать 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));

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

2

Другие решения


По вопросам рекламы [email protected]