代码:
std::vector<std::string>::iterator first = iter;
if( ++iter != iter_is_pointing_to_this_vector.end())
{
...
当取消引用迭代器“first”时,会发生Segmentation故障。当注释掉取消引用程序时,只需在if语句处停止并且不继续。 iter的增加显然不符合我的预期:我想确保有问题的向量有或没有更多成员传递“iter”指向的项目。
这种行为的原因是什么?
答案 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;
}