减去和比较随机访问迭代器:为啥和在哪里?
Posted
技术标签:
【中文标题】减去和比较随机访问迭代器:为啥和在哪里?【英文标题】:Subtracting and comparing random-access iterators: why and where?减去和比较随机访问迭代器:为什么和在哪里? 【发布时间】:2014-08-12 18:35:10 【问题描述】:我正在为我的工作开发一个小型库,并且我从标准 random-access iterator category 派生了一些类。这让我可以使用诸如迭代器特征之类的东西,并且当我使用像 algorithm
这样的标准库时不必太担心。当然我知道我不必这样做,我可以选择bidirectional category 来代替,甚至可以实现我自己的。但这不是重点。
IMO,双向和随机访问类别之间的“差距”太大,我不明白迭代器之间的减法和比较运算符 的必要性 - 即:@ 987654324@、a<b
和 a>b
(及其松散的变体)。
为什么标准强制实施这些运算符,有人可以给我一个例子,说明(不)等式测试、混合迭代器标量算术(复合或非复合)运算符和偏移解引用运算符是不够的?
【问题讨论】:
在搜索算法中,您可能需要距离 (a-b)。在恒定时间内得到 a-b 后,你也会得到 。 不是-pedantic
,但在这种情况下正确的术语是category,而不是interface。此外,差异是鸭子类型与继承方法的漏洞点。
@Manu343726 查看更正后的帖子 :)
@Sh3ljohn:为什么查找两个位置之间的差异会返回位置而不是距离?减去两个点得到一个偏移量,减去两个时间点得到一个持续时间。
@Sh3ljohn 在数学中 (!) 声明 The difference between two points (maths) is a point
是完全错误的
【参考方案1】:
需要在迭代器之间进行区分的一个常见情况是二进制搜索:在不知道距离的情况下,您将不知道需要向左侧的迭代器添加多少才能到达O(1)
的中点时间。一旦知道了距离,您就可以应用混合迭代器标量算术来到达中间,也是在恒定时间内。
请注意,您可以通过重复递增一个迭代器直到到达另一个迭代器来找到距离,但这需要O(n)
时间。
您还需要a < b
比较才能知道哪个迭代器在左侧,哪个迭代器在右侧。如果没有这种比较,您将无法验证二进制搜索算法的输入。
我发现减法运算符应该返回一个 int 而不是迭代器令人困惑,即使“从逻辑上”我希望两个相同类型的对象之间的算术运算也会返回该类型的对象。
减法为您提供距离 - 从一个点到另一个点的步数。这是一个标量数,与迭代器的类型无关。这里的对称性很简单:因为
iteratorA + scalar = iteratorB
简单的算术规则告诉我们
scalar = iteratorB - iteratorA
【讨论】:
感谢您的回答。我认为它部分回答了我的问题;我仍然想了解为什么标准会在“随机访问迭代器”的定义中包含这些约束。 @Sh3ljohn 该标准需要能够“抽象出”指针语义的迭代器,以便与标准库的算法(例如排序和二进制搜索)一起工作,而不会破坏这些算法。这些算法需要找到中点并比较同一范围内的位置。当它们以指针的形式实现时,它们会减去和比较指针;该标准要求随机访问迭代器能够做同样的事情,这样一个算法就可以在指针和迭代器上工作。 好吧,我认为你的回答非常好,尽管我还不同意随机访问迭代器和指针在概念上应该以相同的方式表现这一事实。但这将成为一个自以为是的讨论,我想这不是拥有它的地方:) 再次感谢以上是关于减去和比较随机访问迭代器:为啥和在哪里?的主要内容,如果未能解决你的问题,请参考以下文章