在“for”循环内递增后,迭代器结束检查失败

Ale*_*lex 3 c++ iterator c++11

这个问题很可能是重复的,但我还没有找到关于这个问题的任何内容。

为什么增加iteratora 中最后位置的 avector会使其不等于vector.end()

或者,换句话说,为什么会正常执行:

int main() {
    vector<string> vec = {"ve"};

    for (auto it = vec.begin(); it != vec.end(); it++) {}

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

虽然这会进入无限循环:

int main() {
    vector<string> vec = {"ve"};

    for (auto it = vec.begin(); it != vec.end(); it++) { it++; }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

和这个:

int main() {
    vector<string> vec = {"ve"};

    for (auto it = vec.begin(); it != vec.end(); it++) {
        cout << (it == vec.end()) << " ";
        cout << (*it == "ve") << endl;
        it++;
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

导致SEGFAULT打印:

0 1
0
Run Code Online (Sandbox Code Playgroud)

所以,it事实上,增加了,因此它的内容变成空(根据调试器优化),但它并没有变得等于vec.end()。为什么?

cad*_*luk 5

想象一下it指向 before vec.end(),据说是循环的最后一次迭代for

  1. it != vec.end();将是true,因此循环将继续。
  2. it++;体内被执行。it == vec.end()现在。
  3. it++for循环头开始执行。超出it一分。 vec.end()

vec.end()点超出 的最后一个元素vec,该元素仍然定义良好。vec.end() + 1( 的最终值it)超出 的最后一个元素两个vec点,这是未定义的行为。

这意味着取消引用迭代器会访问未分配的内存(解释了分段错误)。再次出现未定义的行为。