调整向量大小会使迭代器无效吗?

mik*_*ike 20 c++ iterator vector

我发现这个C++代码:

vector<int> a;
a.push_back(1);
a.push_back(2);
vector<int>::iterator it = a.begin();
a.push_back(4);
cout << *it;
Run Code Online (Sandbox Code Playgroud)

打印一些大的随机数; 但如果你a.push_back(3)在第3行和第4行之间添加,它将打印1.你能解释一下吗?

jal*_*alf 28

用更细致的措辞编辑

是的,调整向量的大小可能会使指向向量的所有迭代器无效.

通过在内部分配存储数据的数组来实现向量.当向量增长时,该数组可能会耗尽空间,当它向量时,向量会分配一个更大的新数组,将数据复制到该数组,然后删除旧数组.

因此,指向旧内存的旧迭代器不再有效.但是,如果矢量向下调整大小(例如,通过pop_back()),则使用相同的数组.该阵列永远不会自动缩小尺寸.

避免这种重新分配(和指针失效)的一种方法是首先调用vector::reserve(),留出足够的空间,以便不需要这种复制.在您的情况下,如果您a.reserve(3)在第一个push_back()操作之前调用,那么内部数组将足够大,以便push_back可以执行而无需重新分配数组,因此您的迭代器将保持有效.


use*_*783 7

仅当向量执行重新分配时,向量迭代器才会失效.

调用push_back(4)导致向量分配一个新的内存块 - 这就是导致迭代器失效的原因.当您还使用时push_back(3),不会执行重新分配,push_back(4)因此迭代器仍然有效.