[英]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.