繁体   English   中英

向量迭代器不可递增

[英]vector iterator not incrementable

* 编辑:我删除了else部分。 迭代器被迭代了两次*

运行时出现错误:

文件:c:\\ program files(x86)\\ microsoft visual studio 10.0 \\ vc \\ include \\ vector行:99

表达式:向量迭代器不可递增


文件:c:\\ program files(x86)\\ microsoft visual studio 10.0 \\ vc \\ include \\ vector行:100

表达式:“标准C ++库超出范围” && 0

当我的代码在目录中找到新图片时,必须发送警报。 但是由于我无法自己删除文件,因此我不得不欺骗。 找到图像后发送警报之前,我先将其与已发送的图片(sentPictures)进行比较。 在sendPictures中,我删除了在目录中删除的图像,因为如果我每次都要与过去找到的每个图像进行比较,则该程序可能会有点笨拙,因为xD处于无限循环中。

这是我得到的错误。 为了找到存储的元素是否仍在目录中,我将旧元素向量(sentPictures)与新元素向量(refreshVector)进行了比较。 对于每个旧元素(sentPictures),如果在refreshVector中找不到它们,则将它们逐个删除。 就我而言,即使什么都不做,我也会收到错误消息。 仅通过此循环就会崩溃。 就我而言,我的目录中有9个元素,它打印5并崩溃。 我检查了一下,sendPictures中再有多少元素,然后在refreshVector中。 我想我不能很好地使用迭代器。 这是一段代码。

for(std::vector<Picture>::iterator it = sentPictures.begin(); it != sentPictures.end(); it++){
        std::cout << "1" << std::endl;

        if(std::find(refreshVector.begin(), refreshVector.end(), *it) == refreshVector.end()){ 
            tcout << *it <<std::endl;
            //if picture not found in refresh vector, then delete it
            //delete *it;
            //it = refreshVector.erase(it);
        }else{
            std::cout<< "2" <<std::endl;
            ++it;
        }

    }

PS:指令删除*它; 无法编译。 VS表示“表达式必须具有指针或句柄类型”,在“ *”符号的下面。 我将搜索if条件中是否使用了“ it”这一事实。

指令删除*它; 无法编译。

您正在尝试删除一个对象,删除需要一个指针。 您也应该永远不要删除/删除[]没有使用new / new []分配的任何东西,由于您有一个带有对象(不是指针)的向量,所以您似乎没有这样做。

如果要从容器中删除某物,则应使用其适当的函数vector<T>::erase() delete仅适用于在堆上分配的对象。

同样,在使用向量的情况下,您不必使用迭代器,则可以安全地使用索引。

for(int i=0; i != sentPictures.size(); i++)
{
   sentPictures[i]; //
   //etc
}

尽管find函数仍将返回迭代器。

另一个要注意的是,不要后增加迭代器,它会做一个冗余副本,而是先增加它,尽管不确定编译器是否会优化它。

现在似乎已经解决了擦除问题,我需要遍历这段代码直到结束。 它崩溃了,但是不知道为什么。

它崩溃是因为您正在循环内进行擦除。 删除元素时会更改数组大小,并且在执行删除操作后, 迭代器将无效 从向量中删除元素效率很低,您可能需要使用std :: set。

您无法delete未分配给new的对象,并且由于您拥有对象的向量而不是指针,因此我怀疑您已为它们分配了new

如果您要这样做,则在迭代器上调用delete不会神奇地修改vector 请改用删除/擦除惯用语(google)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM