为什么不能将两个std::vector迭代器相加?

8

这是一个关于C++的好奇问题,涉及到如何通过迭代器查找索引。

给定两个向量迭代器,为什么它们可以相减而不能相加?

例如,为什么这段代码可以编译和运行:

std::vector<int> vect;
vect.begin() - vect.end();

虽然这并不:
std::vector<int> vect;
vect.begin() + vect.end();

问题是更好地理解迭代器的行为方式。对于那些进行评论和回答的人,谢谢你们!我需要更深入地了解指针算术以理解这一点。
我认为最有帮助的答案是迭代器就像指针。
减去两个指针以获取它们之间距离的差异是有意义的,就像在数字线上看1-10并想要7到3之间的距离一样,您可以将3从7中减去得到4的距离。
添加7和3得到10,并不能帮助我找到它们之间的距离,在容器中会指向超出容器边界的内容,这既不方便也没有作用。

13
你认为这个操作的输出应该是什么?也就是说,你期望迭代器相加的结果是什么? - adnan_e
5
不能进行乘法或除法的原因与不能进行加法或减法的原因完全相同——这些运算没有有意义的结果。 - Slava
2
@BrandonManess 减去迭代器就相当于减去指针。它表示两者之间的元素数量。 - François Andrieux
1
在我们对为什么迭代器或指针的添加毫无意义这一点上都摆出高姿态之前,请注意,如果您想计算中点,则它可能有用,其中表达式(x + y) / 2是可处理的。遗憾的是,它需要写成x + (y - x) / 2,这不够清晰,并且依赖于第二项是一个区间。 - Bathsheba
2
把迭代器想象成你家的地址。你正在将你家的地址与你朋友家或隔壁家的地址相加。但是,地址之间并不能相加。 - Thomas Matthews
显示剩余11条评论
2个回答

15

迭代器模型类似于指针。

给定指针P1P2,表达式P2 - P1可以获得指针之间的偏移量/距离。而表达式P1 + P2不会得到有意义的结果。 将这个思想扩展到迭代器,你就能理解为什么两个迭代器之间的减法是有意义的,但加法却没有。


2
谢谢Sahu!我需要更深入地了解指针才能真正掌握这个概念。“表达式P2 - P1给出指针之间的偏移量”这种措辞帮了我很多。 - Brandon Maness
4
我更倾向于称之为“距离”而不是“偏移量”。但正是这一点导致减法有意义而加法没有。 - bitmask
2
迭代器不仅是指针的模型,它们实际上可能就是指针。这在 std::vector 中可能不是这种情况,但是 std::array<T, N>::begin() 通常会返回指向数组开头的 T* - Jan Schultke

3

因为执行该操作没有什么意义,所以在 iterator 中未定义 operator+


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接