迭代器没有按预期运行

时间:2012-12-17 10:42:52

标签: c++ iterator

代码:

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

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

当取消引用迭代器“first”时,会发生Segmentation故障。当注释掉取消引用程序时,只需在if语句处停止并且不继续。 iter的增加显然不符合我的预期:我想确保有问题的向量有或没有更多成员传递“iter”指向的项目。

这种行为的原因是什么?

1 个答案:

答案 0 :(得分: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;
}