C ++相邻查找:向量迭代器不可解除引用

时间:2014-03-02 01:05:27

标签: c++

我有一个包含以下元素的排序向量:

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; 
}  

有什么建议吗?

1 个答案:

答案 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; 
}