C++ 和迭代器失效

标签 c++ iterator

所以我正在学习 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/

相关文章:

c++ - 在 C++ 中创建结构化(偶数)空间以显示数据

c++ - 持有锁时 fork

java - java中迭代器的使用

c++ - 无法将元素插入嵌套的 STL 整数集中

java - 我正在尝试实现我自己的 HashSet,但我不知道 iterator() 方法应该返回什么?

c++ - 从 C++ DLL 中的 Delphi 应用程序中回调

c++ - 如何处理*.IDL 文件中的循环依赖?

c++ - 搜索数组的上限

Java : Implementing iterator for user-created HashSet class. next() 和 hasNext() 的语义?

java - Netbeans 中的 Neo4J : error with Iterator