如果它们不是随机访问,如何告诉advance()在输入迭代器上使用+ =运算符

时间:2013-05-21 06:30:59

标签: c++ iterator

考虑像join_iterator这样的输入迭代器:它迭代其他范围的串联。反复调用++i可能比简单i += n 慢。

尽管如此,大多数需要以任意数量推进迭代器的C ++代码都使用std::advance,当迭代器不是随机访问时,它会自动转向调用++i

(可悲的是,大多数人使用std::advance(i, n)代替using std::advance; advance(i, n),所以我不能只为我的迭代器提供advance并依赖于ADL。)

另一方面,我不能使用++=,因为输入迭代器不必实现它们。

所以问题是:我将如何支持这种情况,在以下情况下:

  • 实施这样的迭代器?

  • 使用可能具有优化operator +=的输入迭代器?

(请注意,advance+不是唯一重要的情况 - distance-有同样的问题。)

1 个答案:

答案 0 :(得分:3)

根据C ++11§24.4.4,

  

由于只有随机访问迭代器提供了+和 - 运算符,因此该库提供了两个函数模板advancedistance这些函数模板使用+-作为随机访问迭代器(因此,它们是常量时间); 用于输入,转发和双向迭代器,它们使用++提供线性时间实现。

您只需定义+-,并指定std::random_access_iterator_tag。无需专门化或超载std::advance