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

时间:2018-07-30 16:30:41

标签: c++ vector iterator

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

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;

会引发“向量迭代器不兼容”异常,并且这样:

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;

不是。这似乎是由于在第一个示例中it2是向量的结尾,而不是在第二个例子中,但是我想对为什么第一个抛出而第二个没有抛出的原因进行完整的说明。

我正在使用MSVC作为参考。

1 个答案:

答案 0 :(得分:5)

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

如果不重新分配向量,所有其他迭代器将保持不变,这就是为什么第二个代码片段还可以的原因。