如何测试迭代器是否等于某个位置

时间:2014-11-04 23:25:03

标签: c++ vector iterator

下面的代码编译,但是当我运行exe时,它将传递向量的结尾,我得到一个运行错误。这两行在构造函数中定义。

vector< myObj > myVect;
vector< myObj >::iterator myVectit = myVect.begin();   

调用一个方法来递增迭代器。它似乎工作正常,直到ti到达其对象的末尾。

myVectit++;
if(myVectit == myVect.end())    //<- Vector iterator not dereferenecable
    myVectit = myVect.begin();

if语句给我一个错误&#34; Vector iterator不能解除引用&#34;


经过大量的捏造后,我发现这个工作正常。

++myVectit ;
if(this->myVectit == this->myVect.end()){
    myVectit = myVect.begin();
}

奇怪的是反向工作

if(this->myVectit != this->myVect.end()){
    ++myVectit ;
}
else
    myVectit = myVect.begin();

所以我留下了两个问题。我做的第一次尝试和第二次使用&#34; this-&gt;&#34;之间的主要区别是什么。

第二个为什么我的解决方案没有反过来?

3 个答案:

答案 0 :(得分:3)

正如您在initial revision中所拥有的那样,

myVectit++;是未定义的行为,因为

 vector< myObj >::iterator myVectit;

此时未正确初始化。

您的代码应该类似于

 vector< myObj > myVect;
 vector< myObj >::iterator myVectit = myVect.begin(); // <<< Initialize your iterator
                                                      //     properly

 if(myVectit != myVect.end()) { // Test for in range
     ++myVectit; // Safely increment
 }
 else {
     myVectit = myVect.begin(); // Wrap around
 }

即使您已在其他地方正确初始化myVectit,也应在增加前对myVectit != myVect.end() 进行测试。

答案 1 :(得分:0)

基本上当v.begin()&lt; = it&lt; v.end()和迭代器处于有效状态 你应该善于使用它。

附注 - 我建议使用auto而不是std :: vector :: iterator

截至 1.减少打字 你必须初始化它,你不会遇到代码有UB的情况。

答案 2 :(得分:0)

我找到的最佳选项会增加它,然后检查它是否是向量的结尾。

++myVectit ;
if(this->myVectit == this->myVect.end()){
myVectit = myVect.begin();
}