我有一个包含以下元素的排序向量:
myVect = {-47,-2,-2,19,80,80,80}
我正在尝试使用adjacent_find算法在单独的一行上找到并打印出每个重复元素的范围,如:
-2 -2
80 80 80
我能够让我的代码进行编译,并且它产生正确的输出,除了我得到一个运行时错误,说“vector iterator not dereferencable”。
以下是代码:
vector<int>::iterator vectIt = myVect.begin();
while (vectIt != myVect.end()) {
vectIt = adjacent_find(vectIt, myVect.end());
int currentVal = *vectIt;
while (*vectIt == currentVal) {
cout << *vectIt << " ";
if (vectIt < myVect.end()) {
++vectIt;
}
}
cout << endl;
}
有什么建议吗?
答案 0 :(得分:0)
你在第二个循环中取消引用end
迭代器。
while (*vectIt == currentVal) {
cout << *vectIt << " ";
if (vectIt < myVect.end()) {
++vectIt;
}
}
只需手动完成vectIt
作为向量中最后一个元素的情况(即myVect.end() - 1
,就像它在第3个80
时得到的那样):
if (vectIt < myVect.end()) { // will still be true
++vectIt; // now you set it to myVect.end()
}
现在在下一次迭代中检查:
while (*vectIt == currentVal) // here you dereference it without checking for myVect.end()
你应该将这个条件改为:
while (vectIt != myVect.end() && *vectIt == currentVal)
注意:这仅适用于向量中的最后一个元素至少为2个相等的元素。如果向量中的最后一个元素不等于{-47, -2, -2, 19, 80, 80, 80, 100}
之前的那个元素,那么只有在你的文件中,你才能点击myVect.end()
vectIt = adjacent_find(vectIt,myVect.end());
break
等于vectIt
,或者更确切地说,就像我建议将更新置于while状态一样,并myVect.end()
之后。
vector<int>::iterator vectIt = myVect.begin();
while ( ( vectIt = adjacent_find(vectIt, myVect.end()) ) != myVect.end()) {
int currentVal = *vectIt;
while (vectIt != myVect.end() && *vectIt == currentVal) {
cout << *vectIt << " ";
if (vectIt < myVect.end()) {
++vectIt;
}
}
cout << endl;
}