代码:
std::vector<std::string>::iterator first = iter;
if( ++iter != iter_is_pointing_to_this_vector.end())
{
...
当“首先”取消引用迭代器时,会发生分段错误。当注释掉取消引用时,程序只是在 if 语句处停止并且不会继续。iter 的递增显然没有达到我的预期:我想确保有问题的向量有或没有更多成员传递“iter”指向的项目。
这种行为的原因是什么?
好的,评论太长了,所以我会把它作为答案发布,但它可能不完整。
构造诸如++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;
}