* 编辑:我删除了其他部分。迭代器迭代了两次*
运行时出错:
文件: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 Line:100
表达式:“标准C ++库超出范围”&& 0
我的代码必须在目录中找到新图片时发送警报。但由于我不能自己删除文件,我不得不欺骗。在找到图像时发送警报之前,我将其与已发送的图片(sentPictures)进行比较。在sentPictures中,我删除了目录中删除的图像,因为如果我必须每次比较过去发现的每个图像,程序可能会有点重xD (它处于无限循环中)
这是我得到的错误。要查找存储的元素是否仍在目录中,我将旧元素vector(sentPictures)与新元素(refreshVector)进行比较。对于每个旧元素(sentPictures),如果在refreshVector中找不到它们,我会逐个删除它们。就我而言,即使没有做任何事,我也会收到错误。只是走过这个循环崩溃。在我的情况下,我在目录中有9个元素,它打印5和崩溃。我检查过,然后在refreshPector中有sentPictures中的nuch元素。我想我没有很好地处理迭代器的使用。这是一段代码。
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”在if条件中使用的事实有关。
答案 0 :(得分:3)
指令删除*它;不编译。
您正在尝试删除一个对象,删除一个指针。你也不应该删除/删除[]没有使用new / new []分配的东西,这似乎你不是因为你有一个带对象的向量(而不是指针)。
如果要从容器中删除sth,则应使用其相应的函数vector<T>::erase()
。 delete
仅适用于在堆上分配的对象。
此外,如果是向量,则不必使用迭代器,您可以安全地使用索引。
for(int i=0; i != sentPictures.size(); i++)
{
sentPictures[i]; //
//etc
}
虽然find函数仍会返回迭代器。
另一个注意事项,不要对迭代器进行后期递增,它会执行冗余复制,而是预先递增它,但不确定编译器是否会对其进行优化。
现在擦除问题似乎已被裁定,我需要经历这个问题 代码直到结束。它在洛普的某个地方坠毁但不知道 这是为什么。
崩溃是因为你在循环内部被擦除了;删除元素时更改数组大小,删除操作后更改iterator will be invalid。从向量中删除元素效率很低,您可能需要使用std :: set。
答案 1 :(得分:1)
你不能delete
你没有用new
分配的内容,因为你有一个对象的向量而不是指针,我怀疑你用new
分配了它们。 / p>
在迭代器上调用delete
并不会神奇地修改vector
,如果这就是你所追求的。请使用删除/删除习惯用法(谷歌)。