0

代码:

std::vector<std::string>::iterator first = iter;

if( ++iter != iter_is_pointing_to_this_vector.end())
{
  ...

当“首先”取消引用迭代器时,会发生分段错误。当注释掉取消引用时,程序只是在 if 语句处停止并且不会继续。iter 的递增显然没有达到我的预期:我想确保有问题的向量有或没有更多成员传递“iter”指向的项目。

这种行为的原因是什么?

4

1 回答 1

0

好的,评论太长了,所以我会把它作为答案发布,但它可能不完整。

构造诸如++iter将推进迭代器。因此,如果您的线路在循环内,另一行在++iter其末尾,您将在每个循环中将其推进两次!。++iter不会产生指向下一个元素的迭代器,而是将 移动iter到它。

据我了解,您会++iter != iter_is_pointing_to_this_vector.end()检查下一个元素是否结束。确定当前元素是否是向量中的最后一个。但是你写的代码做了一些不同的事情。

要执行您想要的操作,您需要另一个迭代器,您可以将其设置为当前元素的下一个元素。

std::vector<std::string>::iterator = iter = v.begin();
std::vector<std::string>::iterator = iter2 = v.begin();
++iter2;
while( {...} ){
  if(iter2 != v.end() ){...}
  ++iter2; ++iter;
}

当然,您需要确保v具有多个元素。reverse_iterator如果您的容器提供它,您也可以使用它。

typedef iter_t std::vector<std::string>::iterator;
iter_t = iter = v.begin();
std::reverse_iterator<iter_t> = iter2 = v.rbegin();
while( {...} ){
  if(iter != iter2.base() ){...}
  ++iter;
}

注意:base()将反向迭代器转换为普通(正向)迭代器,以便可以比较它们。

编辑:您似乎可以使用reverse_iterator双向迭代器,这意味着它们也将实现递减操作。因此,由于您实际上并不需要反向迭代,只需要一个相对于 的元素的迭代器end,一种更简单的方法是:

typedef iter_t std::vector<std::string>::iterator;
iter_t = iter = v.begin();
iter_t = iter2 = v.end();
--iter2;
while( {...} ){
  if(iter != iter2){...}
  ++iter;
}
于 2012-12-17T11:18:13.190 回答