我正在为我的工作开发一个小型库,我从标准random-access iterator category派生了一些类。这允许我使用迭代器特征之类的东西,并且在我使用标准库(例如algorithm
)时不必过于担心。当然我知道我不需要,而且我可以选择bidirectional category来代替甚至实现自己的{{3}}。但这不是重点。
IMO,双向和随机访问类别之间的“差距”太大,我不明白迭代器之间的减法和比较运算符的必要性 - 即:{ {1}},a-b
和a<b
(以及其中的松散变体)。
为什么标准强制执行这些运算符,有人可以给我一个例子,其中(in)相等性测试,混合迭代器 - 标量算术(复合或非复合)运算符和偏移解引用运算符是不够的?
答案 0 :(得分:11)
在迭代器之间需要区别的一个常见情况是二进制搜索:在不知道距离的情况下,您不知道需要向左侧的迭代器添加多少才能到达{{1的中点}} 时间。一旦你知道距离,就可以使用混合迭代器 - 标量算法来中间,也可以在恒定时间内。
请注意,您可以通过重复递增一个迭代器来找到距离,直到到达另一个迭代器,但这需要O(1)
时间。
您还需要进行O(n)
比较,以了解哪个迭代器位于左侧,哪个位于右侧。如果没有这种比较,您将无法验证二进制搜索算法的输入。
我觉得令人困惑的是,减法运算符应该返回一个int,而不是一个迭代器,即使&#34;逻辑上&#34;我希望两个相同类型的对象之间的算术运算也会返回该类型的对象。
减法为您提供距离 - 从一个点到另一个点的步数。这是一个标量数,与迭代器的类型无关。这里的对称性很简单:因为
a < b
简单的算术规则告诉我们
iteratorA + scalar = iteratorB