为什么我得到“矢量迭代器+偏移超出范围”错误?

时间:2012-03-25 07:31:13

标签: c++ visual-c++ vector

以下代码导致此错误:

if (bestLine.size() > searchDepth - depth)
    bestLine.erase(bestLine.begin(), bestLine.end() - searchDepth - depth);

当我在错误时检查searchDepth - depth的值时,它是0

基本上,

if (bestLine.size() > 0)
    bestLine.erase(bestLine.begin(), bestLine.end());

导致此错误。 (或者不是。请参阅下面的评论。)

据我所知,上面的代码应该擦除整个向量,在这种情况下这是期望的行为。

我做错了什么?

3 个答案:

答案 0 :(得分:5)

尝试在表达式中添加括号:bestLine.end() - (searchDepth - depth)。如果简单地从左到右进行评估,结果就会大不相同。

答案 1 :(得分:1)

检查bestLine.size()是否大于searchDepth - depth,但是你减去searchDepth + depth。在减法中更改深度前的符号: bestLine.erase(bestLine.begin(), bestLine.end() - searchDepth *+* depth);

答案 2 :(得分:1)

这不是编码问题,而是数学问题。

有问题的数学:

   bestLine.end() - searchDepth - depth
=> bestLine.end() + (-1) * searchDepth + (-1) * depth
=> bestLine.end() + (-1) * (searchDepth + depth)
=> bestLine.end() - (searchDepth + depth)

因此,您尝试擦除(searchDepth + depth)元素,而不是尝试擦除(searchDepth - depth)元素。

正确的数学:

  bestLine.end() - (searchDepth - depth)