向量迭代器不可递增

时间:2014-01-29 09:30:21

标签: c++ iterator

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

运行时出错:

  

文件: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条件中使用的事实有关。

2 个答案:

答案 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,如果这就是你所追求的。请使用删除/删除习惯用法(谷歌)。