减去并比较随机访问迭代器:为什么以及在哪里?

时间:2014-08-12 18:35:10

标签: c++ iterator random-access

我正在为我的工作开发一个小型库,我从标准random-access iterator category派生了一些类。这允许我使用迭代器特征之类的东西,并且在我使用标准库(例如algorithm)时不必过于担心。当然我知道我不需要,而且我可以选择bidirectional category来代替甚至实现自己的{{3}}。但这不是重点。

IMO,双向和随机访问类别之间的“差距”太大,我不明白迭代器之间的减法和比较运算符的必要性 - 即:{ {1}},a-ba<b(以及其中的松散变体)。

为什么标准强制执行这些运算符,有人可以给我一个例子,其中(in)相等性测试,混合迭代器 - 标量算术(复合或非复合)运算符和偏移解引用运算符是不够的?

1 个答案:

答案 0 :(得分:11)

在迭代器之间需要区别的一个常见情况是二进制搜索:在不知道距离的情况下,您不知道需要向左侧的迭代器添加多少才能到达{{1的中点}} 时间。一旦你知道距离,就可以使用混合迭代器 - 标量算法来中间,也可以在恒定时间内。

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

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

  

我觉得令人困惑的是,减法运算符应该返回一个int,而不是一个迭代器,即使&#34;逻辑上&#34;我希望两个相同类型的对象之间的算术运算也会返回该类型的对象。

减法为您提供距离 - 从一个点到另一个点的步数。这是一个标量数,与迭代器的类型无关。这里的对称性很简单:因为

a < b

简单的算术规则告诉我们

iteratorA + scalar = iteratorB