Я думаю, что использование адреса разыменованного итератора является правильным способом достижения того, что вы пытаетесь сделать.
iterator it = ...
T *ptr = &*it;
Однако это опасно, потому что вы можете получить висячие указатели, если объект A уничтожен перед объектами B. Вот почему функция release
, которая позволяет вызывающей стороне получать адрес объекта, также удаляет указатель из контейнера.
Если вы можете поддержать накладные расходы, вы можете подумать об изменении boost::ptr_vector
на вектор умных указателей, например, std::vector<boost::shared_ptr<T> >
.