Iterator增量是否会产生新的迭代器?

时间:2018-02-04 13:35:25

标签: c++ pointers iterator

  

当我们向(或从)指针添加(或减去)一个整数值时,   结果是一个新指针。那个新指针指向元素   在原始指针之前(或之后)给出数字:( pp.119 c ++ primer 5ed

我也从书中学到,指针是迭代器( pp.118 c ++ primer 5ed )。

问题

我是否还可以声称迭代器上的算术运算创建了一个全新的迭代器。

3 个答案:

答案 0 :(得分:6)

本书介绍了编写p + n时的情况,其中p是指针,n是整数。该表达式生成指针类型的新值。由您决定存储值的位置;你也可以决定不存储它。

增加指针,即写p += n,会将原始指针的值更改为p + n

它对迭代器的工作方式是相同的:it + n生成一个新的迭代器,而it += n更改现有的迭代器。

注意第一个表达式可以写成std::next(it, n),而第二个表达式应该写成std::advance(it, n),用于迭代器和指针。

答案 1 :(得分:1)

  

我是否还可以声称迭代器上的算术运算创建了一个全新的迭代器。

标准库中的迭代器旨在在某种程度上模仿其行为中的指针。因此,如果您正在讨论源自标准库容器的迭代器,那么对它们进行后递增(也将修改源代码),或者向它们添加数字(对于随机访问迭代器),将导致新的纯迭代器值(或者& #34;新的迭代器"正如你所说的那样)。并且add不会修改标准库中的源迭代器。

但是,由于迭代器通常可以是任何用户定义的类,并且有自己的重载运算符集,所以没有说明。理论上可以设计一个迭代器,其结果是对我们作为操作数提供的现有迭代器的引用。

事实上,即使在标准库中,pre-increment也会返回对当前迭代器的引用(根据C ++中指针的行为)。

答案 2 :(得分:1)

是的,不,也许。迭代器就是所谓的“代理对象”,它是一个包含与某个其他对象相关联的元数据的对象。在这种情况下,迭代器尝试表现得像指针,至少是一种。

因此,您的实际迭代器对象将完全相同(例如,如果在迭代器的构造函数中设置断点,则不会在迭代器上从operator++调用它)。给出答案“不”。

迭代器内部将有一个不同的值,其行为就像一个不同的(在引用文本中也称为“new”)指针。所以它给出了答案“是”。

我确信我们可以进一步讨论这个问题,得出结论,最终答案取决于你所说的“新迭代器”的含义。