使用std :: vector迭代器和调整大小/保留的奇怪/有趣的行为

Gus*_*yan 3 c++ iterator vector

我有两个非常相似的代码; 这个:

std::vector<int> fail{0};
fail.reserve(2);
std::vector<int>::iterator it1 = fail.begin(), it2 = fail.begin() + 1;
fail.push_back(0);
it1 == it2;
Run Code Online (Sandbox Code Playgroud)

抛出"矢量迭代器不兼容"异常,这个:

std::vector<int> fail{0, 0};
fail.reserve(3);
std::vector<int>::iterator it1 = fail.begin(), it2 = fail.begin() + 1;
fail.push_back(0);
it1 == it2;
Run Code Online (Sandbox Code Playgroud)

没有.这似乎是由于it2在第一个例子中是向量的结束而在第二个例子中没有,但我只想得到一个完整的澄清,为什么第一次抛出但第二次没有.

作为参考,我正在使用MSVC.

Bau*_*gen 5

std::vector::push_back总是使过去的迭代器无效,所以在第一种情况下it2.无论调整大小,都会发生这种情

如果向量没有重新分配,所有其他迭代器保持不变,这就是为什么他们的第二个片段是好的.