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

Posted

技术标签:

【中文标题】这段代码在哪里取消引用无效的迭代器? (C++)【英文标题】:Where is this code dereferencing an invalid iterator? (C++) 【发布时间】:2009-05-16 03:04:58 【问题描述】:

我有一个循环

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() 语句为假时才会发生错误。我不知道如果 if() 语句为真会发生什么。

【问题讨论】:

【参考方案1】:

向量的大小是多少?

如果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++;

【讨论】:

vI 总是 2,aI 从 0 开始。谢谢【参考方案2】:

取消引用发生在

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

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

【讨论】:

以上是关于这段代码在哪里取消引用无效的迭代器? (C++)的主要内容,如果未能解决你的问题,请参考以下文章

C ++迭代器取消引用和前缀递增/递减样式? *--Iter ok 风格是不是明智?

输入迭代器是不是只能在赋值的右手符号上被取消引用?

取消引用集合迭代器时将“字符串&”绑定到“常量字符串”时出错

是否可以在 C++ 中使用转换迭代器?

由引用传递的迭代器集/映射迭代器不可取消引用

迭代器知识整理