【问题标题】:traversing a container a second time with an input iterator使用输入迭代器第二次遍历容器
【发布时间】:2017-01-24 18:54:35
【问题描述】:

无法保证使用输入迭代器第二次遍历容器会以相同的顺序遍历值。此外,在输入迭代器递增后,无法保证其先前的值仍然可以取消引用。

或

InputIterator 是一个可以从指向的元素中读取的迭代器。 InputIterators 只保证单遍算法的有效性:一旦 InputIterator i 增加,其先前值的所有副本都可能失效。

为什么它先前值的所有副本都可能无效?这些陈述的概念是什么?

【问题讨论】:

  • 想想std::istream_iterator 和std::cin
  • 请说出您的来源!为什么你会从书中引用甚至不提及他们的名字?!

标签: c++ iterator input-iterator


【解决方案1】:

这就是说你的迭代器只能读取它当前指向的元素,它不知道前一个或下一个元素。

考虑让两个迭代器指向std::list<T>

          Item1 ---> Item2 ---> Item3 ---> Item4
Iter0 ----↑          ↑
Iter1----------------ˈ

想象如下增加这些:

Iter0 = Iter1;
Iter1++;

在增量之后,您的迭代器集将如下所示:

             Item1 ---> Item2 ---> Item3 ---> Item4
Iter0 ------------------↑          ↑
Iter1------------------------------ˈ

Iter1 的前一个值存储在 Iter0 中,因此它始终指向 Iter1 之前的元素。

现在假设我删除了Item2。

             Item1 ---> Item3 ---> Item4
Iter0 -???              ↑
Iter1-------------------ˈ

Iter1 仍然有效并指向Item3。

Iter0 之前的 Iter1 值不再有效并指向“无”(这意味着取消引用此迭代器现在将被视为未定义行为)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-18
    • 2016-09-03
    • 1970-01-01
    • 2019-07-28
    • 2012-10-22
    • 1970-01-01
    相关资源
    最近更新 更多