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