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

Meh*_*dad 16 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并且-具有相同的问题.)

Pot*_*ter 3

根据C++11\xc2\xa724.4.4,

\n\n
\n

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

\n
\n\n

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

\n

  • 但这是在撒谎——迭代器不是随机访问的。 (3认同)
  • 说谎的问题在于会造成附带损害!例如,使其成为随机访问也需要我实现“operator--”——但我通常不能。这意味着任何对随机访问迭代器具有不同(例如优化)行为的现有代码(可能通过使用带有负参数的“operator-=”或“operator+=”)现在完全无法与我的迭代器一起工作。为了避免您认为这是牵强的,Visual C++ 根据迭代器是否是随机访问对“std::rotate”使用不同的算法。 (2认同)