下面的代码编译,但是当我运行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;之间的主要区别是什么。
第二个为什么我的解决方案没有反过来?
答案 0 :(得分:3)
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();
}