我发现这个 C++ 代码:
vector<int> a;
a.push_back(1);
a.push_back(2);
vector<int>::iterator it = a.begin();
a.push_back(4);
cout << *it;
打印一些大的随机数;但是如果你在第 3 行和第 4 行之间添加 a.push_back(3)
,它会打印 1。你能给我解释一下吗?
最佳答案
用更谨慎的措辞编辑
是的,调整 vector 的大小可能会使指向 vector 的所有迭代器无效。
vector 是通过在内部分配一个存储数据的数组来实现的。当 vector 增长时,该数组可能会耗尽空间,当它发生时, vector 会分配一个新的更大的数组,将数据复制到该数组,然后删除旧数组。
因此,指向旧内存的旧迭代器不再有效。
但是,如果 vector 被向下 调整大小(例如通过pop_back()
),则使用相同的数组。数组永远不会自动缩小。
避免这种重新分配(和指针失效)的一种方法是首先调用 vector::reserve()
,以留出足够的空间以使这种复制不是必需的。在您的情况下,如果您在第一个 push_back()
操作之前调用 a.reserve(3)
,那么内部数组将足够大,以至于 push_back
的执行无需重新分配数组,因此您的迭代器将保持有效。
关于c++ - 调整 vector 大小是否会使迭代器无效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1624803/