Вы правы, эти два совершенно разные.
Первое отличие, как вы заметили, это семантика владения. Право собственности на элементы в контейнере указателя НЕ разделяется. В этом отношении boost::ptr_vector<T>
намного ближе к std::vector<std::unique_ptr<T>>
.
Но это не единственная разница!
- если явно не указано в типе, контейнер указателей не будет содержать нулевого указателя
- Контейнер указателя имеет глубокую семантику копирования (с использованием метода
new_clone
) и может быть скопирован, только если удерживаемый объект является копируемым
- Контейнер-указатель имеет глубокую константную семантику, то есть если контейнер имеет значение
const
, тогда невозможно изменить один из его элементов.
Что касается того, почему @timday
был вынужден упомянуть Boost Pointer Container, я думаю, это потому, что он хотел немного расширить вопрос. Контейнер Boost Pointer очень похож на Smart Pointers, который может содержать несколько объектов и обеспечивает более приятный синтаксис, чем контейнеры указателей в целом.
Что касается его сравнения с std::vector< boost::shared_ptr<T> >
Я думаю, это просто потому, что это традиционный способ реализации вектора указателей при отсутствии семантики перемещения (нет unique_ptr
), поскольку auto_ptr
нельзя использовать в контейнере STL , Люди просто не знают о контейнерах указателей большую часть времени ...