【问题标题】:How to invalidate an iterator?如何使迭代器无效?
【发布时间】:2010-12-06 05:25:55
【问题描述】:

由于我知道程序中的迭代器可能会被之前的一些操作无效,所以我想明确地使其无效。比如给一个指针赋值NULL使其无效,我只想在迭代器上做同样的事情。 container.end() 不是这里的确切想法。我试图将 NULL 分配给我的迭代器,但它失败了。如何在迭代器上获得与 NULL 指针相同的行为?

【问题讨论】:

  • 首先,我认为这种行为不是好主意。其次,您可以存储指向迭代器的指针。
  • 如果你真的想要有人也可以解释如何明确地获得未定义的行为;-)
  • 你为什么要这个?之后你可以用迭代器做任何你以前不能做的事情。

标签: c++ stl


【解决方案1】:

可能会被之前的一些操作失效,我想明确地使其失效

...如果您知道它可能无效,那么您只需停止使用它。显式地使迭代器无效并不能完成任何事情,因为无论哪种方式使用它都是一个编程错误。

【讨论】:

  • 尝试通过使用额外的块来限制迭代器的范围。在块之外,迭代器不再存在。总比无效好。
【解决方案2】:

您为什么不想使用container.end()?...它适用于大多数容器...

对于 std::string 你可能想检查一下,位置是否是yourstring.npos;

【讨论】:

    【解决方案3】:

    这不应该总是有效吗? (迭代器总是可赋值和默认构造的)

    template <typename Iter>
    void foo(Iter it){
      it = Iter(); // invalidate
    }
    

    【讨论】:

    • 这很酷。我可以直接获取迭代器类型,所以该函数是不必要的。顺便说一句,我认为我们需要通过引用传递it,对吗?
    • 为了修改它,当然。这只是一个例子。我把它变成一个函数的唯一原因是它是说“假设迭代器类型是Iter并且迭代器对象被称为it...”的最简单的方式:)
    【解决方案4】:

    一般来说,你不能。有一些迭代器根本不能失效。例如,可以将随机数生成器建模为输出迭代器,operator* 返回当前数字,operator++ 生成新数字。

    【讨论】:

      猜你喜欢
      • 2017-06-21
      • 2011-08-28
      • 1970-01-01
      • 1970-01-01
      • 2022-12-31
      • 1970-01-01
      • 2011-05-06
      • 1970-01-01
      • 2019-06-14
      相关资源
      最近更新 更多