【问题标题】:Why can two std::vector iterators not be summed?为什么两个 std::vector 迭代器不能相加?
【发布时间】:2020-09-02 15:16:33
【问题描述】:

这更像是一个关于 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,这无法帮助我找到它们之间的距离,并且在容器中,最终会指向容器边界之外的东西,这没有帮助或有用。

【问题讨论】:

  • 并且,在您看来,该操作的输出应该是什么?即,您希望迭代器加法的输出是什么?
  • 和它们不能被乘除的原因完全一样——这样的操作没有有意义的结果。
  • @BrandonManess 减去迭代器与减去指针相同。它是两者之间的元素数。
  • @BrandonManess 请将此信息添加到您的问题中。否则就不清楚你在期待什么。
  • 将迭代器视为您家的地址。您正在将您的家庭地址与您朋友的家或隔壁家的地址相加。添加地址没有意义。

标签: c++ iterator operator-overloading stdvector pointer-arithmetic


【解决方案1】:

迭代器是根据指针建模的。

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

【讨论】:

  • 谢谢萨胡!我需要更多地研究指针才能真正掌握这个概念。 “表达式 P2 - P1 为您提供了指针之间的偏移量”这个措辞帮助了很多。
  • 我宁愿称它为距离而不是偏移量。但这就是为什么减法有意义而加法没有意义的原因。
  • 迭代器不仅是根据指针建模的,它们实际上可能是指针。 std::vector 可能不是这种情况,但 std::array&lt;T, N&gt;::begin() 通常会将 T* 返回到数组的开头。
【解决方案2】:

因为执行该操作没有多大意义,因此iterator 中没有定义operator+

【讨论】:

    猜你喜欢
    • 2020-07-23
    • 1970-01-01
    • 1970-01-01
    • 2017-04-15
    • 2011-01-13
    • 2021-10-27
    • 2021-01-19
    • 1970-01-01
    • 2011-04-14
    相关资源
    最近更新 更多