代码之家  ›  专栏  ›  技术社区  ›  fredoverflow

*it++对输出迭代器是如何有效的?

  •  12
  • fredoverflow  · 技术社区  · 14 年前

    在示例代码中,我经常看到诸如 *it++ 对于输出迭代器。表达式 *信息+ 复制一份 it 增量 ,然后返回最终取消引用的副本。据我所知,复制输出迭代器会使源无效。但随后 创建拷贝后执行的操作是非法的,对吗?我对输出迭代器的理解有缺陷吗?

    5 回复  |  直到 9 年前
        1
  •  6
  •   rafak    14 年前

    表达式 *it++ (必须)复印一份 增加,等等。 此表达式仅为方便起见才有效,因为它遵循常规的语义。只有 operator= 做实际的工作。例如,在G++实现中 ostream_iterator , operator* , operator++ operator++(int) 只做 事情: return *this (换句话说,什么都没有!).我们可以写例如:

    it = 1;
    it = 2;
    *it = 3;
    ++it = 4;
    

    而不是: *it++ = 1; *it++ = 2; *it++ = 3; *it++ = 4;

        2
  •  14
  •   Patryk    9 年前

    标准要求 *r++ = t 为输出迭代器工作(24.1.2)。如果它不起作用,就不是标准定义的输出迭代器。

    这取决于迭代器实现,以确保这些语句在引擎盖下正常工作。

    您不应该保留一个输出迭代器的多个副本的原因是它具有单传递语义。迭代器只能在每个值处取消引用一次(即,它必须在每个取消引用操作之间递增)。一旦迭代器被取消引用,它的副本就不能被取消引用。

    这就是为什么 *R++T 作品。由原始迭代器生成副本,取消引用原始迭代器,并递增副本。原始迭代器将不再使用,副本也不再引用相同的值。

        3
  •  1
  •   CB Bailey    14 年前

    输出迭代器的工作方式与普通迭代器不同,并且指定了它们的接口,以便在类指针表达式中使用它们。( *it++ = x )有有用的结果。

    通常情况下, operator*() , operator++() operator++(int) 全部返回 *this 作为引用和输出迭代器有一种魔力 operator= 执行预期的输出操作。因为无法从输出迭代器中读取 操作符*() 等等,不要像其他迭代器那样工作。

        4
  •  1
  •   Jerry Coffin    14 年前

    看你的评论,大部分的混淆似乎来自SGI文档,我认为这在这一点上有点误导。

    复制输出迭代器会 使复制的迭代器无效。真正的限制非常简单:您只应该取消对输出迭代器的给定值的引用一次。但是,一次有两个副本是可以的,只要您在它们具有相同值的情况下只取消引用其中一个副本。在这样一个例子中,您取消引用一个值,然后丢弃它的值,并增加另一个值,但只有在增量发生后才取消引用它,这一切都是完美的。

        5
  •  -4
  •   Alexander Rafferty    14 年前

    迭代器不是指针吗?递增,然后取消对它的引用只会移动到下一个元素。