C++ 减去和比较随机访问迭代器:为什么和在哪里?

C++ 减去和比较随机访问迭代器:为什么和在哪里?,c++,iterator,random-access,C++,Iterator,Random Access,我正在为我的工作开发一个小型库,我从标准中派生了一些类。这使我能够使用迭代器特性之类的东西,并且在使用标准库(例如算法时,不必太担心。当然,我知道我不必这么做,我可以选择替代方案,甚至可以实现自己的方案。但这不是重点 在我看来,双向访问和随机访问类别之间的“差距”太大了,我不理解迭代器之间的减法和比较运算符的必要性——即:a-b,ab(及其松散变体) 为什么标准强制这些操作符的实现,有人能给我一个例子,其中(in)相等测试,混合迭代器标量算法(复合或非复合)运算符和偏移取消引用运算符是不够的?需

我正在为我的工作开发一个小型库,我从标准中派生了一些类。这使我能够使用迭代器特性之类的东西,并且在使用标准库(例如
算法
时,不必太担心。当然,我知道我不必这么做,我可以选择替代方案,甚至可以实现自己的方案。但这不是重点

在我看来,双向访问和随机访问类别之间的“差距”太大了,我不理解迭代器之间的减法和比较运算符的必要性——即:
a-b
ab
(及其松散变体)


为什么标准强制这些操作符的实现,有人能给我一个例子,其中(in)相等测试,混合迭代器标量算法(复合或非复合)运算符和偏移取消引用运算符是不够的?

需要在迭代器之间存在差异的一种常见情况是二进制搜索:如果不知道距离,您将不知道需要向左侧的迭代器添加多少才能在
O(1)
时间内到达中点。一旦知道了距离,就可以应用混合迭代器标量算法到达中间,同样是在恒定时间内

请注意,可以通过重复递增一个迭代器直到到达另一个迭代器来找到距离,但这需要
O(n)
时间

您还需要进行
a
比较,以了解哪个迭代器位于左侧,哪个位于右侧。如果没有这种比较,您将无法验证二进制搜索算法的输入

我感到困惑的是,减法运算符应该返回int,而不是迭代器,即使“从逻辑上”我希望相同类型的两个对象之间的算术运算也会返回该类型的对象

减法给出了距离——从一点到另一点的步数。这是一个标量数,和迭代器的类型无关。这里的对称性很简单:因为

iteratorA + scalar = iteratorB
简单的算术规则告诉我们

scalar = iteratorB - iteratorA

在搜索算法中,您可能需要距离(a-b)。在固定时间内得到a-b之后,你也得到了。这并不是为了成为一个学究,但在这种情况下正确的术语是类别,而不是接口。另外,差异是鸭子类型化与继承方法之间的漏洞。@Manu343726参见更正的帖子:)@Sh3ljohn:为什么查找两个位置之间的差异会返回一个位置而不是距离?减去两个点会得到一个偏移量,减去两个时间点会得到一个持续时间。@Sh3ljohn在数学中(!)这句话
两点之间的差(数学)是一个点
是完全错误的谢谢你的回答。我想这部分回答了我的问题;我仍然想理解为什么标准会在“随机访问迭代器”的定义中包含这些约束。@Sh3ljohn标准需要能够“抽象”指针语义的迭代器,以便使用标准库的算法,例如排序和二进制搜索,在不破坏这些算法的渐近定时的情况下。这些算法需要找到中点并比较相同范围内的位置。当它们以指针的形式实现时,它们减去并比较指针;该标准要求随机访问迭代器也能做到这一点,这样一个算法就可以同时在指针和迭代器上工作。好吧,我认为你的答案很好,尽管我还不完全同意随机访问迭代器和指针在概念上应该以相同的方式工作。但这将成为一个固执己见的讨论,我想这不是一个拥有它的地方:)再次感谢