1

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

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
}

我现在的问题是我不能以任何方式 push_back 迭代器,我只是没有将指针从迭代器中取出。

有没有我没有看到的简单方法,或者 boosts ptr_vector 是这种情况下的错误选择?

提前致谢。

4

2 回答 2

2

取消引用 ptr_vector::iterator 会给你一个参考。然后你可以使用 & 来获取该引用的地址,所以vsnap.push_back(&(*it))应该编译。你遇到了什么错误?

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

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

当然,这会在将对象添加到新向量之前将其从旧向量中删除。如果您希望对象保留在两个向量中,您可以使用 std::vector 或 std::vector >。另一种选择是将第一个保留为 boost::ptr_vector ,但将第二个设为 std::vector ,它什么都不拥有,只指向原始向量中的对象。那么你将不得不小心生活。

于 2010-03-22T16:27:41.223 回答
0

您需要克隆第一个向量持有的对象:

for(tvec::iterator it = v.begin(); it != v.end(); ++it)
{
   if((*v).anyCondition)
      vsnap.push_back(new_clone(*it));
}
于 2010-03-22T16:26:59.727 回答