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



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

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。

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

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

相关内容

  • 没有找到相关文章

最新更新