推回增压::ptr_向量<>;::另一个boost::ptr_向量中的迭代器?

推回增压::ptr_向量<>;::另一个boost::ptr_向量中的迭代器?,boost,iterator,push-back,ptr-vector,Boost,Iterator,Push Back,Ptr Vector,我有以下代码(只是在这里输入,可能有打字错误或其他东西): typedef boost::ptr_向量tvec; tvec v; // ... 填充v。。。 tvec-vsnap; for(tvec::iterator it=v.begin();it!=v.end();++it) { 如果(*v.anyCondition) vsnap.push_back(it);/(*it)或&(*it)不起作用 } 我的问题是现在我不能以任何方式推回迭代器,我只是不能从迭代器中取出指针 有没有一个我没有看到

我有以下代码(只是在这里输入,可能有打字错误或其他东西):

typedef boost::ptr_向量tvec;
tvec v;
// ... 填充v。。。
tvec-vsnap;
for(tvec::iterator it=v.begin();it!=v.end();++it)
{
如果(*v.anyCondition)
vsnap.push_back(it);/(*it)或&(*it)不起作用
}
我的问题是现在我不能以任何方式推回迭代器,我只是不能从迭代器中取出指针

有没有一个我没有看到的简单方法,或者boosts ptr_向量是这个案例的错误选择

提前感谢。

您需要查看第一个向量所包含的对象:

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

取消引用ptr_向量::迭代器将为您提供一个引用。然后您可以使用&来获取该引用的地址,因此
vsnap.push_back(&(*it))
应该编译。你犯了什么错误

此外,请注意您的用法是不正确的。旧的ptr_向量拥有该对象,不管您如何处理该对象的地址。因此,在代码中,两个ptr_向量拥有相同的对象。然后他们都试图删除它,你就会崩溃。您可能希望转移所有权:

vsnap.push_back(v.release(it));
当然,这会在将对象添加到新向量之前将其从旧向量中移除。如果希望对象保留在两个向量中,可以使用std::vector或std::vector>。另一种选择是将第一个保持为boost::ptr_向量,但将第二个保持为std::向量,该向量不拥有任何内容,只指向原始向量中的对象。那么你必须小心使用寿命。

顺便说一句,你可以写“v->anyCondition”而不是“(*v).anyCondition”。
vsnap.push_back(v.release(it));