Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 不可递增的向量迭代器_C++_Iterator - Fatal编程技术网

C++ 不可递增的向量迭代器

C++ 不可递增的向量迭代器,c++,iterator,C++,Iterator,*编辑:我删除了else部分。迭代器被迭代了两次* 运行时出错: 文件:c:\ProgramFiles(x86)\microsoft visual studio 10.0\vc\include\vector 线路:99 表达式:向量迭代器不可递增 文件:c:\ProgramFiles(x86)\microsoft visual studio 10.0\vc\include\vector行:100 表达式:“标准C++库超出范围”& & 0<P> 我的代码在目录中找到新图片时必须发出警报。但是由

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

运行时出错:

文件:c:\ProgramFiles(x86)\microsoft visual studio 10.0\vc\include\vector 线路:99

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


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

表达式:“标准C++库超出范围”& & 0<P> 我的代码在目录中找到新图片时必须发出警报。但是由于我不能自己删除这些文件,我不得不耍花招。在发现图像时发送警报之前,我会将其与已发送的图片(sentPictures)进行比较。在sentPictures中,我删除了目录中删除的图像,因为如果我必须将每次都与过去找到的每个图像进行比较,程序可能有点繁重 (它在一个无限循环中)

这是我得到的错误。为了确定存储的元素是否仍在目录中,我比较了旧元素向量(sentPictures)和新元素向量(refreshVector)。对于每个旧元素(sentPictures),如果在refreshVector中找不到它们,我会逐个删除它们。在我的情况下,即使什么都没做,我也会出错。只是在这个循环中行走就会崩溃。在我的例子中,目录中有9个元素,它打印5个元素,然后崩溃。我检查了一下,在sentPictures中有as nuch元素,然后在refreshVector中有as 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;
        }

    }
for(std::vector::iterator it=sentPictures.begin();it!=sentPictures.end();it++){

std::cout您不能
删除
您没有分配的
new
,而且由于您有一个对象向量,而不是指针,我怀疑您是否分配了
new

在迭代器上调用
delete
,并不会神奇地修改
向量,如果这是您想要的。请改用remove/erase习惯用法(谷歌)

指令delete*it;不编译

您正试图删除一个对象,delete接受一个指针。您也不应该删除/delete[]任何未使用new/new[]分配的内容,因为您有一个包含对象(而不是指针)的向量,所以您似乎没有这样做

如果要从容器中删除某个对象,应使用其相应的函数
vector::erase()
delete
仅用于堆上分配的对象

此外,对于向量,您不必使用迭代器,您可以安全地使用索引

for(int i=0; i != sentPictures.size(); i++)
{
   sentPictures[i]; //
   //etc
}
尽管find函数仍将返回迭代器

另一个注意事项是,不要对迭代器进行后期增量,它将执行冗余复制,而是对其进行预增量,尽管我不确定编译器是否会对其进行优化

现在擦除问题似乎已经解决了,我需要解决这个问题 直到代码结束。它在lopp中的某个地方崩溃,但不知道 为什么


它崩溃是因为你在循环内擦除;删除元素时数组大小会改变,删除操作后数组大小也会改变。从向量中删除元素效率很低,你可能需要使用std::set。

你考虑过使用吗?另外,你可能会发现
std::set
比向量更有效。WhozCraig:这是ju我只是弄错了向量;)“永远不要增加迭代器”什么?那么当删除“else”时,你希望如何迭代任何东西我的问题解决了。它迭代了两次。我可能解释得不好。你说得对,我要纠正它;)好的,谢谢。我被删除和擦除弄糊涂了。我已经擦除了,但在坏向量上,没有看到这个;)好的,我已经看到有人在增加迭代器。@Mr.Starck是的,人们一直都在这样做。是吗esn并不意味着这是最佳实践:-)好吧,我会删除这一部分。我觉得这有点奇怪;)但是LOL,你知道你的迭代器答案解决了这个问题吗!!!因为我增加了它,所以我出现了错误!!!