为什么 C++ 会在这里抛出超出范围的错误?

Why C++ throws an out of range error here?

我真的找不到这里出现“结束后无法寻找向量迭代器”错误的原因。我无法显示整个代码,但我认为这部分应该足够了:

qDebug() << Pun.size() << ", " << 2*pos - counter;
Pun.erase(Pun.begin() + 2*pos - counter); //the error seems to happen here
qDebug() << "B";
Pun.erase(Pun.begin() + 2*pos - counter);
counter += 2;

当我 运行 我的代码时,最后打印的是“4, 1”,而“B”没有打印,所以它必须在上面的行中,但如果 Pun.size() 是 4 和 2*pos - 计数器是 1.

也许这有帮助:这是针对一个特殊问题的大算法的一部分,当我在很多实例上测试该程序时,我 运行 遇到了这个问题。我将错误追溯到一个特殊的实例,奇怪的是当我 运行 算法第一次没有发生这个错误但是当它第二次完成时它以某种方式发生了....

任何提示都会很有帮助...

你是说

Pun.erase(Pun.begin() + (2*pos - counter)); 

运算符优先级问题 -- +- 具有相同的优先级(并且是 left-recursive),所以您的擦除调用实际上是

Pun.erase((Pun.begin() + 2*pos) - counter);

这可能会试图在 Pun 结束之后继续前进,导致它抛出异常。我在这里假设 Pun 是一些进行边界检查的自定义序列类型(即 而不是 std::vector)。你要

Pun.erase(Pun.begin() + (2*pos - counter));