【问题标题】:vector iterator not incrementable向量迭代器不可递增
【发布时间】: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&lt;&gt;::erase() 吗?
  • 另外,您可能会发现std::set 比向量更有效。
  • WhozCraig :这正是我之后要做的。我只是弄错了向量;)
  • “从不增加迭代器”什么?那么你希望如何迭代任何东西?
  • 删除“else”部分时,我的问题已解决。它迭代了两次。我可能解释得不好。你说得对,我会纠正它;)

标签: c++ iterator


【解决方案1】:

指令 delete * it;无法编译。

你试图删除一个对象,delete 需要一个指针。您还应该永远不要删除/删除 [] 任何未使用 new/new [] 分配的内容,这似乎不是因为您有一个带有对象(而不是指针)的向量。

如果你想从容器中移除某物,你应该使用它的相应函数vector&lt;T&gt;::erase()delete 仅适用于在堆上分配的对象。

此外,如果是向量,您不必使用迭代器,您可以安全地使用索引。

for(int i=0; i != sentPictures.size(); i++)
{
   sentPictures[i]; //
   //etc
}

虽然 find 函数仍然会返回一个迭代器。

另一个注意事项,不要对迭代器进行后增量,它会做一个冗余副本,而不是预增量,但不确定编译器是否会优化它。

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

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

【讨论】:

  • 好的,我已经看到有人发布了增加迭代器的帖子。
  • @Mr.Starck 是的,人们总是这样做。并不意味着这是最佳实践:-)
  • 好吧,我将删除此部分。我觉得这有点奇怪;)
  • 但是大声笑,你知道你的迭代器回答解决了这个问题吗!!!那是因为我增加了它,所以我有错误!!!
【解决方案2】:

你不能用deletenew分配你没有分配的东西,因为你有一个对象向量,而不是指针,我怀疑你用new分配它们。

在迭代器上调用delete 不会神奇地修改vector,如果那是您所追求的。请改用删除/擦除习语(google)。

【讨论】:

  • 好的,谢谢。我对删除和擦除感到困惑。反正我已经擦除了,但是在坏向量上,没有看到这个;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-16
  • 2013-03-23
相关资源
最近更新 更多