fre*_*low 12 c++ iterator stl post-increment
在示例代码中,我经常看到代码,例如*it++输出迭代器.表达式*it++复制it,递增it,然后返回最终解除引用的副本.据我了解,制作输出迭代器的副本会使源无效.但是it,在创建副本之后执行的增量将是非法的,对吧?我对输出迭代器的理解有缺陷吗?
Din*_*ngo 14
该标准要求*r++ = t输出迭代器(24.1.2).如果它不起作用,它不是标准定义的输出迭代器.
由迭代器实现来确保这些语句在引擎盖下正确工作.
您不应该保留输出迭代器的多个副本的原因是它具有单通道语义.迭代器只能在每个值处解除引用一次(即必须在每个解除引用操作之间递增).解除引用迭代器后,它的副本不能.
这就是为什么*r++ = t有效.副本由原始迭代器构成,原始迭代器被解除引用并且副本递增.永远不会再使用原始迭代器,并且副本不再引用相同的值.
表达*it++并没有(有)做它的一个副本,并没有增加它,等等.这表达是有效的仅仅是为了方便,因为它遵循的通常语义.只做operator=实际的工作.例如,在G ++实现的ostream_iterator,operator*,operator++和operator++(int)只做一个事情:return *this(!换句话说,没有什么).我们可以写例如:
it = 1;
it = 2;
*it = 3;
++it = 4;
Run Code Online (Sandbox Code Playgroud)
代替: *it++ = 1; *it++ = 2; *it++ = 3; *it++ = 4;
| 归档时间: |
|
| 查看次数: |
2532 次 |
| 最近记录: |