【发布时间】:2014-01-29 09:30:20
【问题描述】:
*编辑:我删除了 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 中我删除了目录中删除的图像,因为如果我每次都必须与过去找到的每个图像进行比较,程序可能有点重 xD (它处于无限循环中)
这是我得到的错误。要查找存储的元素是否仍在目录中,我将旧元素向量 (sentPictures) 与新元素向量 (refreshVector) 进行比较。对于每一个旧元素(sentPictures),如果在refreshVector中没有找到,我会一一删除。就我而言,即使什么也没做,我也会收到错误消息。只是走过这个循环就会崩溃。在我的情况下,我在目录中有 9 个元素,它打印 5 并崩溃。我检查了一下,sentPictures 中的元素和 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 : 指令 delete * it;不编译。 VS 说“表达式必须有指针或句柄类型”,底层的“*”符号。我要搜索它是否与 if 条件中使用“it”这一事实有关。
【问题讨论】:
-
您考虑过使用
std::vector<>::erase()吗? -
另外,您可能会发现
std::set比向量更有效。 -
WhozCraig :这正是我之后要做的。我只是弄错了向量;)
-
“从不增加迭代器”什么?那么你希望如何迭代任何东西?
-
删除“else”部分时,我的问题已解决。它迭代了两次。我可能解释得不好。你说得对,我会纠正它;)