所以我正在学习 Accelerated C++ 并且对 C++ 中的迭代器失效有点不确定。也许问题在于从未解释过这些迭代器的构造方式。
举个例子:
带有 {1,2,3} 的 vector
如果我的迭代器在 {2} 上并且我在 {2} 上调用删除,我的迭代器无效。为什么?在我的脑海中,{3} 被向下移动,因此 {2} 所在的内存位置因此迭代器仍指向有效元素。我认为这是不正确的唯一方法是,如果迭代器是预先为每个元素创建的,并且每个迭代器都有某种类型的字段,其中包含该容器中后续元素的地址。
我的另一个问题与诸如“使所有其他迭代器无效”之类的语句有关。嗯,当我循环遍历 vector 容器时,我使用的是一个迭代器。 vector 中的所有这些元素是否都隐式地具有与它们相关联的迭代器,或者我是否遗漏了什么?
最佳答案
In my head, {3} is shifted down so the memory location of where {2} was so the iterator is still pointing to a valid element.
可能是这样的。但同样有效的是,整个 vector 在内存中重新定位,从而使所有迭代器指向现已失效的内存位置。 C++ 根本不提供任何保证。(请参阅评论以进行讨论。)
Do all those elements in the vector implicitly have their own iterator associated with them or am I missing something?
您只是忽略了一个事实,即除了您的循环变量之外,您可能还有其他迭代器引用相同的 vector 。例如,下面的循环是一种惯用风格,它缓存 vector 的 end
迭代器以避免冗余调用:
vector<int> vec;
// …
for (vector<int>::iterator i(vec.begin()), end(vec.end()); i != end; ++i) {
if (some_condition)
vec.erase(i); // invalidates `i` and `end`.
}
(别介意现代编译器上的 STL 实际上不需要这个结束迭代器的拷贝。)
关于C++ 和迭代器失效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4206631/