Должен ли я использовать boost:: ptr_vector <T> или vector <boost:: shared_ptr <T>>?

Мне нужен контейнер указателей. Вы порекомендовали бы boost::ptr_vector<T> или std::vector<boost::shared_ptr<T> >? (Или что-то еще?)

Если интересно, моя фактическая структура данных относительно сложна (см. здесь) и в настоящее время хранит объекты, а не указатели, но я бы хотел изменить это ( используя контейнеры-указатели), чтобы избавиться от ненужного копирования:

typedef std::multimap<Foo0, std::map<int, double> > VecElem;
std::vector<VecElem> vec;

Ответы

Ответ 1

Кому принадлежит объект? Если контейнер принадлежит объектам (что означает, что объекты не должны проживать дольше, чем контейнер), используйте ptr_vector. В противном случае используйте вектор shared_ptr s. Контейнеры стандартной библиотеки (например, std::vector или std::list) владеют объектами, которые они содержат, поэтому семантика ptr_vector ближе к этому.

Ответ 2

shared_ptr<> имеет семантику общего владельца, которая реализуется посредством увеличения и уменьшения количества ссылок. Это связано с некоторыми накладными расходами, особенно когда многопоточность включена (потому что эти счетчики должны быть заблокированы).

Если ваши объекты разделены, используйте shared_ptr<>.
Но если они фактически принадлежат контейнеру и должны умереть вместе с контейнером, а ссылки (указатели) могут быть мертвы, когда контейнер умирает, тогда используйте контейнеры-указатели, потому что у них меньше накладных расходов.
Если вы не уверены, используйте shared_ptr, чтобы быть в безопасности. Если окажется, что у вас проблема с производительностью, вы всегда можете оптимизировать ее позже. (Легче оптимизировать рабочую систему, чем работать с преждевременно оптимизированной системой.)