我有以下代码(只是在这里键入,可能有拼写错误或东西):
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这个案例的错误选择?
提前致谢。
答案 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));
}