在另一个boost :: ptr_vector中推回boost :: ptr_vector< ...> :: iterator?

时间:2010-03-22 16:12:52

标签: boost iterator push-back ptr-vector

我有以下代码(只是在这里键入,可能有拼写错误或东西):

typedef boost::ptr_vector<SomeClass> tvec;
tvec v;

// ... fill v ...

tvec vsnap;

for(tvec::iterator it = v.begin(); it != v.end(); ++it)
{
   if((*v).anyCondition)
       vsnap.push_back( it ); // (*it) or &(*it) doesn't work
}

我现在的问题是我无法以任何方式推送迭代器,我只是没有将指针从迭代器中取出。

有没有一种简单的方法我没有看到,或者是ptr_vector这个案例的错误选择?

提前致谢。

2 个答案:

答案 0 :(得分:2)

取消引用ptr_vector :: iterator会为您提供引用。然后你可以使用&amp;获取该引用的地址,因此vsnap.push_back(&(*it))应该编译。你得到什么错误?

此外,请注意您的使用不正确。无论你使用对象的地址做什么,旧的ptr_vector都拥有该对象。因此,使用您的代码,您将拥有两个拥有相同对象的ptr_vectors。然后他们都会尝试删除它,然后你就崩溃了。您可能希望转而转让所有权:

vsnap.push_back(v.release(it));

当然,这会将对象从旧向量中删除,然后再将其添加到新向量中。如果希望对象保留在两个向量中,可以使用std :: vector或std :: vector&gt;。另一个选择是保持第一个是boost :: ptr_vector但是使第二个变为std :: vector,它不拥有任何东西,只指向原始向量中的对象。然后你必须要小心一生。

答案 1 :(得分:0)

您需要clone第一个向量所持有的对象:

for(tvec::iterator it = v.begin(); it != v.end(); ++it)
{
   if((*v).anyCondition)
      vsnap.push_back(new_clone(*it));
}