c++ - 什么是迭代器失效?

标签 c++ iterator

我看到它被引用了很多,但它到底是什么没有明确的答案。我的经验是使用高级语言,所以我不熟悉集合框架中存在的无效性。

什么是迭代器失效?

为什么会出现?为什么难对付?

最佳答案

  1. 迭代器是美化的指针。迭代器失效很像指针失效。这意味着它突然指向垃圾数据。

  2. 因为这样做很自然,但却是错误的:

    for(iterator it = map.begin(); it != map.end(); ++it) {
        map.erase(it->first);
        // whoops, now map has been restructured and iterator 
        // still thinks itself is healthy
    }
    
  3. 因为那个错误就在那里?没有编译器错误,没有警告,你输了。你只需要接受足够好的训练来观察它们并防止它们。如果你不知道自己在做什么,那就是非常隐蔽的错误。 C++ 的设计理念之一是速度胜过安全。在 C++ 语言设计者看来,将导致迭代器失效而不是未指定行为的运行时检查成本太高。

当您迭代数据结构和修改结构本身时,您应该保持高度警惕,而不仅仅是其中包含的对象。那时你可能应该跑到文档并检查操作是否非法。

关于c++ - 什么是迭代器失效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16904454/

相关文章:

c++ - 通过子实现调用父构造函数

c++ - Visual C++ BigInt 和 SecureRandom?是否有带有 modPow 的 BigInt 库?

c# - 如何将结构从 C# 传递到 C++ DLL?

c++ - 获取返回的 multimap 迭代器的内容

java - RandomIterator 不产生随机输出

Javascript - 获取原型(prototype)以返回生成器

c++ - 当shared_ptr被破坏时堆损坏

c++ - 声音以什么格式存储? OpenAL/SFML

java - 何时为列表创建迭代器?

c++ - 迭代器和整数的减法