考虑这段代码:
#include <vector>
#include <iostream>
int main(int argc, char** args)
{
std::vector<int> vec;
vec.push_back(0);
for (auto iter = vec.begin(); iter != vec.end(); iter++)
{
vec.push_back((*iter) + 1);
std::cout << *iter << std::endl;
}
}
我以为这会把所有的数字打印到无限大。 但它所做的是打印大量的零(以及偶尔的-256,什么?) 不料却撞上了SegFault。
我的假设是,在对vec.push_back
的调用将内部数据移动到新数组之后,ITER
仍然指向旧数组。
这里的问题到底出在哪里? 我的假设是正确的吗?push_back
调用使迭代器无效?
有趣的是,当我将std::vector替换为std::list时,代码按预期工作。 改用std::列表保存吗? 或者这只是意外地正常工作?
std::vector::push_back
如果新的向量大小大于以前的容量,将使该向量上的所有迭代器无效。 (原因是由于向量的重新分配)。
未定义使用无效迭代器的行为。
std::list::push_back
不会使任何迭代器无效。