繁体   English   中英

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

[英]How is *it++ valid for output iterators?

在示例代码中,我经常看到诸如*it++用于输出迭代器。 表达*it++使得副本it ,递增it ,然后返回其最后取消引用的副本。 据我了解,制作输出迭代器的副本会使源无效。 但随后的增量it被创建副本后,执行将是非法的,对不对? 我对输出迭代器的理解有缺陷吗?

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

由迭代器实现来确保这些语句在引擎盖下正确工作。

你不应该保留输出迭代器的多个副本的原因是它具有单通道语义。 迭代器只能在每个值处解除引用一次(即必须在每个解除引用操作之间递增)。 解除引用迭代器后,它的副本不能。

这就是*r++ = t原因。 副本由原始迭代器构成,原始迭代器被解除引用并且副本递增。 永远不会再使用原始迭代器,并且副本不再引用相同的值。

表达*it++ (必须)使它的一个副本, 增加它等,这表达式是有效的仅仅是为了方便,因为它遵循通常的语义。 只有operator=才能完成实际工作。 例如,在ostream_iterator g ++实现中, operator*operator++operator++(int)只做件事: return *this (换句话说,什么都没有!)。 我们可以写例如:

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

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

输出迭代器不像普通迭代器那样工作,并且它们的接口被指定,以便它们可以在类似指针的表达式( *it++ = x )中使用,并且具有有用的结果。

通常, operator*()operator++()operator++(int)都返回*this作为引用,输出迭代器有一个magic operator= ,它执行预期的输出操作。 因为你无法从输出迭代器中读取,所以operator*()等不能像其他迭代器一样工作并不重要。

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

复制一个输出迭代器失效复制的迭代器。 真正的限制很简单:你应该只取消引用一次输出迭代器的给定值。 但是,一次拥有两个副本就没问题,只要你只有一个副本,它们具有相同的值。 在这种情况下你要解除引用一个,然后丢弃它的值,并递增另一个但只在增量​​发生后才解除引用它,这一切都很好。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM