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

Bra*_*ess 8 c++ iterator operator-overloading pointer-arithmetic stdvector

这更像是一个关于 C++ 的好奇问题,是在学习如何查找迭代器引用的索引后提出的。

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

例如,为什么要编译和运行:

std::vector<int> vect;
vect.begin() - vect.end();
Run Code Online (Sandbox Code Playgroud)

虽然这不会:

std::vector<int> vect;
vect.begin() + vect.end();
Run Code Online (Sandbox Code Playgroud)

问题是更好地了解迭代器的行为方式。对于那些评论和回答的人,谢谢!我需要更多地研究指针算法才能理解这一点。

我认为最有帮助的答案是迭代器就像指针。

减去两个指针来得到它们的距离差是有道理的,就像在数轴上看 1-10 并想要 7 和 3 之间的距离,你从 3 中减去 7 得到 4 的距离。

将 7 和 3 相加得到 10,这并不能帮助我找到它们之间的距离,并且在容器中最终会指向容器边界之外的东西,这没有帮助或有用。

R S*_*ahu 14

迭代器以指针为模型。

给定指针P1P2,该表达式P2 - P1为您提供指针之间的偏移/距离。您无法从表达式中期待任何明智的选择P1 + P2。将这个想法扩展到迭代器,你就会明白为什么两个迭代器之间的减法有意义而加法没有意义。

  • 我宁愿称之为距离而不是偏移。但这就是为什么减法有意义而加法没有意义的原因。 (4认同)
  • 谢谢萨胡!我需要更多地研究指针才能真正掌握这个概念。“表达式 P2 - P1 给出了指针之间的偏移量”这个措辞有很大帮助。 (2认同)
  • 迭代器不仅是模仿指针的,它们实际上也可能是指针。对于 `std::vector` 可能不是这种情况,但 `std::array&lt;T, N&gt;::begin()` 通常会在数组的开头返回一个 `T*`。 (2认同)