考虑像join_iterator
这样的输入迭代器:它迭代其他范围的串联。反复调用++i
可能比简单i += n
慢。
尽管如此,大多数需要以任意数量推进迭代器的C ++代码都使用std::advance
,当迭代器不是随机访问时,它会自动转向调用++i
。
(可悲的是,大多数人使用std::advance(i, n)
代替using std::advance; advance(i, n)
,所以我不能只为我的迭代器提供advance
并依赖于ADL。)
另一方面,我不能使用+
或+=
,因为输入迭代器不必实现它们。
所以问题是:我将如何支持这种情况,在以下情况下:
实施这样的迭代器?
使用可能具有优化operator +=
的输入迭代器?
(请注意,advance
和+
不是唯一重要的情况 - distance
和-
有同样的问题。)
答案 0 :(得分:3)
根据C ++11§24.4.4,
由于只有随机访问迭代器提供了+和 - 运算符,因此该库提供了两个函数模板
advance
和distance
。 这些函数模板使用+
和-
作为随机访问迭代器(因此,它们是常量时间); 用于输入,转发和双向迭代器,它们使用++提供线性时间实现。
您只需定义+
和-
,并指定std::random_access_iterator_tag
。无需专门化或超载std::advance
。