2010-03-02 6 views
4

Я хочу, чтобы переместить определенный элемент от а до Ь:Перемещение объектов из одного Boost, ptr_container к другому

boost::ptr_vector<Foo> a, b; 
// ... 
b.push_back(a.release(a.begin() + i))); 

Приведенный выше код не компилируется, так как функция релиз возвращает boost::ptr_container_detail::static_move_ptr<...>, который не подходит для отодвигая.

Как мне продолжить?

EDIT: Я узнал, что возвращенный объект имеет .get() .release(), который содержит необработанный указатель (что также может привести к некоторым проблемам безопасности исключений). Я бы предпочел не полагаться на недокументированные внутренние функции, поэтому не стесняйтесь делиться лучшими решениями ...

ответ

4
boost::ptr_vector<Foo> a, b; 

// transfer one element a[i] to the end of b 
b.transfer(b.end(), a.begin() + i, a); 
// transfer N elements a[i]..a[i+N] to the end of b 
b.transfer(b.end(), a.begin() + i, a.begin() + i + N, a); 
+0

Спасибо, это решает проблему. :) – Tronic

0

Лично я предпочитаю использовать std :: vector <> boost :: shared_ptr (ie std: : vector> a, b).

Затем вы можете использовать стандартные векторные функции.

+0

Этот подход более прост и, возможно, более надежный, но контейнеры-указатели намного эффективнее, если вам нужно жонглировать сотнями тысяч объектов. – timday

Смежные вопросы