C ++“vector iterator not dereferencable”在运行时

时间:2015-10-21 20:15:44

标签: c++ vector iterator dereference

实现这个简单的程序我在运行时发现了当我在 FIRST 结束时键入eof时发生的错误。错误说“ vector iterator not dereferencable ”。那可能吗?迭代器在while周期后声明!我仍然无法理解我拼错了什么。有人能帮我吗? PS。程序应检查向量是否是另一个的前缀。谢谢!这是主要功能:

   int main(){
        vector<int> v1, v2;
        cout << "1st vector: enter integers" << endl;
        int i, j;
        while (cin >> i){
            v1.push_back(i);
        }
        cout << "2nd vector: enter integers" << endl;
        while (cin >> j){
            v2.push_back(j);
        }
        vector<int>::const_iterator i1 = v1.begin();
        vector<int>::const_iterator i2 = v2.begin();
        while ((*i1) && (*i2) && ((*i1) == (*i2))){
            ++i1; ++i2;
        }
        if ((*i1) && (*i2))
            cout << "Vectors not compatible." << endl;
        else
        if (!(*i1))
            cout << "The 1st vector is a prefix for the 2nd." << endl;
        else
            cout << "The 2nd vector is a prefix for the 1st." << endl;
        return 0;
    }

3 个答案:

答案 0 :(得分:1)

vector<int>不是以null结尾的c样式字符串。因此,要检查迭代器是否到达结尾,您需要将它与结束迭代器进行比较。因此,在这两种情况下,您应该编写(*i1) && (*i2)而不是(i1 != v1.end()) && (i2 != v2.end())。同样适用于!(*i1)。您应该将其更改为i1 == v1.end()

@RSahu描述了你遇到的第一个问题。修复第一个问题后,您将遇到我所描述的问题。

要解决他描述的问题,你应该清除坏位并忽略cin缓冲区中剩下的内容。在第二个while循环之前添加以下行:

cin.clear();
cin.ignore();

LIVE

答案 1 :(得分:0)

cin上获得第一个eof后,它就会停留在那里。第二个while循环实际上变成了noop,因为cin认为它已经完成了。从那里,我们经历:

vector<int>::const_iterator i1 = v1.begin();
vector<int>::const_iterator i2 = v2.begin();
while ((*i1) && (*i2) && ((*i1) == (*i2))){
                 ^^^
                 UB!

您在不检查i2的尺寸的情况下取消引用v2

首先,您必须清除std::cin

std::cin.clear();

然后,检查你是否使用向量的正确方法是将迭代器与end()进行比较(而不是简单地解除引用):

while (i1 < v1.end() && i2 < v2.end() && *i1 == *i2) {
    ++i1;
    ++i2;
}

虽然如果您可以访问C ++ 14编译器,但可以使用std::mismatch

auto res = std::mismatch(v1.begin(), v1.end(), v2.begin(), v2.end());
if (res.first < v1.end()) {
    if (res.second < v2.end()) {
        std::cout << "Not compatible!" << std::endl;
    }
    else {
        std::cout << "The 2nd vector is a prefix for the 1st." << std::endl;
    }
}
else {
    std::cout << "The 1st vector is a prefix for the 2nd." << std::endl;
}

答案 2 :(得分:0)

以下栏目:

    while (cin >> i){
        v1.push_back(i);
    }

确保cin >> j失败。因此,没有任何内容添加到块中的v2

    while (cin >> j){
        v2.push_back(j);
    }

由于v2为空,因此使用*i2会导致未定义的行为。