Должен ли я использовать boost :: ptr_vector <T>или вектор? - PullRequest
17 голосов
/ 29 сентября 2010

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

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

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

Ответы [ 2 ]

32 голосов
/ 29 сентября 2010

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

14 голосов
/ 29 сентября 2010

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

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

...