这段代码在哪里取消引用无效的迭代器? (C ++)

时间:2009-05-16 03:04:58

标签: c++ vector iterator

我有一个循环

for(aI = antiviral_data.begin(); aI != antiviral_data.end();)
{
    for(vI = viral_data.begin(); vI != viral_data.end();)
    {
        if((*aI)->x == (*vI)->x && (*aI)->y == (*vI)->y)
        {
            vI = viral_data.erase(vI);
            aI = antiviral_data.erase(aI);
        }
        else
        {
            vI++;
            aI++;
        }
    }
}

但是当antiviral_data包含一个项目时,我会收到错误“vector iterator not dereferencable”。为什么我会发现这个错误?我在哪里取消引用无效的迭代器?

注意:到目前为止,只有在if()语句为false时才会发生错误。我不知道如果if()语句为真,会发生什么。

2 个答案:

答案 0 :(得分:8)

载体的大小是多少?

如果viral_data有更多的元素然后是antiviral_data,那么,因为你以相同的速率增加aI和vI,所以aI会在vI循环结束之前超出界限。

在这里举一个简短的例子:

for(int i = 0; i < 5;)
{
    for(int j = 0; j < 10;)
    {
        i++;
        j++;
    }
}

如果你翻过for循环,你会发现内循环不会结束,直到j i都是10,但根据你的外循环,我应该超过5。

你想在外循环中增加i(或者在你的情况下,aI),如下所示:

for(int i = 0; i < 5;)
{
    for(int j = 0; j < 10;)
    {
        j++;
    }
    i++;
}

答案 1 :(得分:1)

解除引用发生在

((*aI)->x == (*vI)->x && (*aI)->y == (*vI)->y)

并且当该语句对于antiviral_data列表中的最后一个元素为真时发生。在这种情况下,在内部for循环的下一次迭代中,您将取消引用antiviral_data.end(),这是不允许的。