Пожалуйста, рассмотрите следующий фрагмент кода:
int main()
{
typedef boost::ptr_vector<int> ptr_vector;
ptr_vector vec0;
vec0.push_back(new int(1));
vec0.push_back(new int(2));
vec0.push_back(new int(3));
vec0.push_back(new int(4));
vec0.push_back(new int(5));
ptr_vector::iterator last = boost::prior(vec0.end()),
first = boost::prior(last, 3);
ptr_vector vec1(first, last); // this will copy '2, 3, 4' to vec1
struct print
{
void operator()(int const& i) {
std::cout << i.m_i << std::endl;
}
};
std::for_each(vec0.begin(), vec0.end(), print()); // 1, 2, 3, 4, 5
std::for_each(vec1.begin(), vec1.end(), print()); // 2, 3, 4
return 0;
}
Я не хочу copy
элементы в vec1
, но разделяю так, как обеспечивает shared_ptr<>
.Мои требования в основном таковы:
- Совместное использование одних и тех же экземпляров диапазона объектов, являющихся частью контейнера, в другом экземпляре контейнера
- Не хочу использовать один экземпляр вбольше, чем эти два контейнера
- Хотите получать уведомления, когда один элемент «внезапно» удаляется из другого контейнера (или, по крайней мере, получить отметку, например, что-то вроде
shared_ptr::unique()
)
Оба контейнера являются частью одного класса.Таким образом, они имеют одинаковую область и будут уничтожены одновременно.Конструктор этого класса создает оба контейнера.После постройки не будет никаких изменений в этих контейнерах.
Нужно ли вместо этого использовать std::vector<>
из shared_ptr<>
или есть какое-то другое решение?