这段代码在哪里取消引用无效的迭代器? (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 风格是不是明智?