c++ - 调整 vector 大小是否会使迭代器无效?

标签 c++ vector iterator

我发现这个 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/

相关文章:

c++ - 从成员类调用封装的 std::begin 时程序崩溃

c++ - 无需任何库函数即可将 float 转换为字符串的高效方法

c++ - 找到两个 vector 相对于 vector 对象的两个成员的交集的有效方法

vector - 如何将 Vec 发送到以迭代器作为参数的函数?

c++ - 为什么 vector::operator[] 的实现方式与 map::operator[] 不同?

C++:std::vector::resize 与 "normal"分配

c++ - 遍历集合

c++ - "internal linkage"是什么意思?

c++ - C++在编译时如何知道模板类支持哪些方法?

java - 数学密集型、基于计算的网站 - 我应该使用哪种语言?