16

考虑一个输入迭代器,例如join_iterator:它迭代其他范围的串联。重复调用++i可能简单的i += n.

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

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

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

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

  • 实现这样的迭代器?

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

(请注意,这advance并不是+唯一重要的场景——distance并且-有同样的问题。)

4

1 回答 1

3

根据 C++11 §24.4.4,

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

您应该只需要定义+and-并指定std::random_access_iterator_tag。无需专门化或重载std::advance

于 2013-05-21T07:24:10.097 回答