“vector”中的代码是什么意思? (C ++)

时间:2009-05-15 02:44:33

标签: c++ vector iterator assertions

我创建了一个程序,它使用了vector.h #include和迭代器等......但是当我运行程序时,在某些情况下(我还在试图找出那些会是什么)我得到一个断言错误,将我引用到vector.h的第98行。我去了vector.h的第98行,得到了这个:

 #if _HAS_ITERATOR_DEBUGGING
        if (this->_Mycont == 0
            || _Myptr < ((_Myvec *)this->_Mycont)->_Myfirst
            || ((_Myvec *)this->_Mycont)->_Mylast <= _Myptr)
            {
            _DEBUG_ERROR("vector iterator not dereferencable");
            _SCL_SECURE_OUT_OF_RANGE;
            }

有人可以告诉我这意味着什么以及我的程序中有什么导致这个断言?

注意:第98行是记录的开头“_DEBUG_ERROR(”vect ...“

注意:这是我认为程序中的代码触发了错误,但我并不完全确定。

CODE:

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++;
            }
        }
        if((*aI)->x >= maxx || (*aI)->x < 0 || (*aI)->y >= maxy || (*aI)->y < 0)
        {
            aI = antiviral_data.erase(aI);
        }
        else
        {
            aI++;
        }
    }

5 个答案:

答案 0 :(得分:10)

运行时检测到您正在取消引用在begin()之前或end()之后的迭代器。

想象一下,如果删除第7行antiviral_data向量中的最后一项:

aI = antiviral_data.erase(aI);

aI设置为antiviral_data.end(),当您在第14行取消引用时:

if((*aI)->x >= maxx ...

以及第5行:

if((*aI)->x == (*vI)->x

您正在取消引用超出边界的迭代器。

修复是在擦除调用后检查aI != antiviral_data.end(),以确保在继续使用之前没有点到向量的末尾。

答案 1 :(得分:7)

你真的想看看像remove_if这样的STL算法,而不是手动做这个东西。

答案 2 :(得分:5)

一般性评论:在检查end()的迭代器时,请勿使用“<”,而只能使用“!=”。因此,代码的第一行应如下所示:

for(aI = antiviral_data.begin(); aI != antiviral_data.end();)
{
  for(vI = viral_data.begin(); vI != viral_data.end();)
  {
    ...

然而,正如Josh已经指出的那样,你的具体错误在第7行。

答案 3 :(得分:1)

除了接受的答案,并详细说明slavy13的答案 -
编辑 - 正如Josh所提到的,与此问题直接相关 - 我将其留待此处参考)。

代码(但不是此代码)有时会假设您可以从向量中删除元素,并继续迭代。这是一个错误的假设 - 一旦从向量中移除元素,删除元素后面的所有其他迭代器都将失效 - 您不能再认为它们是正确的,并且如果继续使用它们就会发生“坏事”。

这是因为矢量实际上以数组形式存储信息。删除元素后,所有后续元素将被复制一个单元格。迭代器不会相应更新。

强烈建议在尝试执行此类操作时查阅STL文档,因为这样的代码完全可能会在某个STL实现上意外发生,但在其他情况下会失败。

答案 4 :(得分:-2)

擦除向量中的元素会使所有迭代器无效。