当我们向(或从)指针添加(或减去)一个整数值时, 结果是一个新指针。那个新指针指向元素 在原始指针之前(或之后)给出数字:( pp.119 c ++ primer 5ed )
我也从书中学到,指针是迭代器( pp.118 c ++ primer 5ed )。
问题
我是否还可以声称迭代器上的算术运算创建了一个全新的迭代器。
答案 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”)指针。所以它给出了答案“是”。
我确信我们可以进一步讨论这个问题,得出结论,最终答案取决于你所说的“新迭代器”的含义。